aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/kernel/watch.c
diff options
context:
space:
mode:
authorJames Hogan <james.hogan@imgtec.com>2016-03-01 22:19:36 +0000
committerRalf Baechle <ralf@linux-mips.org>2016-05-09 12:00:02 +0200
commita7e89326b415b5d81c4b1016fd4a40db861eb58d (patch)
tree09b9d1962f4a5b24659f765c9abc5a181b3c37ea /arch/mips/kernel/watch.c
parentMIPS: Avoid using unwind_stack() with usermode (diff)
downloadlinux-dev-a7e89326b415b5d81c4b1016fd4a40db861eb58d.tar.xz
linux-dev-a7e89326b415b5d81c4b1016fd4a40db861eb58d.zip
MIPS: Fix watchpoint restoration
Commit f51246efee2b ("MIPS: Get rid of finish_arch_switch().") moved the __restore_watch() call from finish_arch_switch() (i.e. after resume() returns) to before the resume() call in switch_to(). This results in watchpoints only being restored when a task is descheduled, preventing the watchpoints from being effective most of the time, except due to chance before the watchpoints are lazily removed. Fix the call sequence from switch_to() through to mips_install_watch_registers() to pass the task_struct pointer of the next task, instead of using current. This allows the watchpoints for the next (non-current) task to be restored without reintroducing finish_arch_switch(). Fixes: f51246efee2b ("MIPS: Get rid of finish_arch_switch().") Signed-off-by: James Hogan <james.hogan@imgtec.com> Cc: Paul Burton <paul.burton@imgtec.com> Cc: linux-mips@linux-mips.org Cc: <stable@vger.kernel.org> # 4.3.x- Patchwork: https://patchwork.linux-mips.org/patch/12726/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/kernel/watch.c')
-rw-r--r--arch/mips/kernel/watch.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/arch/mips/kernel/watch.c b/arch/mips/kernel/watch.c
index 2a03abb5bd2c..9b78e375118e 100644
--- a/arch/mips/kernel/watch.c
+++ b/arch/mips/kernel/watch.c
@@ -15,10 +15,9 @@
* Install the watch registers for the current thread. A maximum of
* four registers are installed although the machine may have more.
*/
-void mips_install_watch_registers(void)
+void mips_install_watch_registers(struct task_struct *t)
{
- struct mips3264_watch_reg_state *watches =
- &current->thread.watch.mips3264;
+ struct mips3264_watch_reg_state *watches = &t->thread.watch.mips3264;
switch (current_cpu_data.watch_reg_use_cnt) {
default:
BUG();