]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
kprobes: Use synchronize_rcu_tasks() for optprobe with CONFIG_PREEMPT=y
authorMasami Hiramatsu <mhiramat@kernel.org>
Thu, 19 Oct 2017 23:43:39 +0000 (08:43 +0900)
committerIngo Molnar <mingo@kernel.org>
Fri, 20 Oct 2017 07:45:15 +0000 (09:45 +0200)
We want to wait for all potentially preempted kprobes trampoline
execution to have completed. This guarantees that any freed
trampoline memory is not in use by any task in the system anymore.
synchronize_rcu_tasks() gives such a guarantee, so use it.

Also, this guarantees to wait for all potentially preempted tasks
on the instructions which will be replaced with a jump.

Since this becomes a problem only when CONFIG_PREEMPT=y, enable
CONFIG_TASKS_RCU=y for synchronize_rcu_tasks() in that case.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Naveen N . Rao <naveen.n.rao@linux.vnet.ibm.com>
Cc: Paul E . McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/150845661962.5443.17724352636247312231.stgit@devbox
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/Kconfig
kernel/kprobes.c

index 1aafb4efbb51dfea8c5639f2bd68379c930825d4..f75c8e8a229bf8c26532443b0d877214ef1faba3 100644 (file)
@@ -90,7 +90,7 @@ config STATIC_KEYS_SELFTEST
 config OPTPROBES
        def_bool y
        depends on KPROBES && HAVE_OPTPROBES
-       depends on !PREEMPT
+       select TASKS_RCU if PREEMPT
 
 config KPROBES_ON_FTRACE
        def_bool y
index 15fba7fe57c84dc5712faad0958c1f9b32e476fc..a8fc1492b308aef27726b230a4a2a4a08ec85c0d 100644 (file)
@@ -573,13 +573,15 @@ static void kprobe_optimizer(struct work_struct *work)
        do_unoptimize_kprobes();
 
        /*
-        * Step 2: Wait for quiesence period to ensure all running interrupts
-        * are done. Because optprobe may modify multiple instructions
-        * there is a chance that Nth instruction is interrupted. In that
-        * case, running interrupt can return to 2nd-Nth byte of jump
-        * instruction. This wait is for avoiding it.
+        * Step 2: Wait for quiesence period to ensure all potentially
+        * preempted tasks to have normally scheduled. Because optprobe
+        * may modify multiple instructions, there is a chance that Nth
+        * instruction is preempted. In that case, such tasks can return
+        * to 2nd-Nth byte of jump instruction. This wait is for avoiding it.
+        * Note that on non-preemptive kernel, this is transparently converted
+        * to synchronoze_sched() to wait for all interrupts to have completed.
         */
-       synchronize_sched();
+       synchronize_rcu_tasks();
 
        /* Step 3: Optimize kprobes after quiesence period */
        do_optimize_kprobes();