From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Ingo Molnar <mingo@kernel.org>,
Steven Rostedt <rostedt@goodmis.org>,
linux-kernel@vger.kernel.org,
Peter Zijlstra <peterz@infradead.org>,
Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>,
Thomas Gleixner <tglx@linutronix.de>,
"H . Peter Anvin" <hpa@zytor.com>
Subject: Re: [PATCH -tip v2] kprobes: Use synchronize_rcu_tasks() for optprobe with CONFIG_PREEMPT
Date: Mon, 11 Sep 2017 21:04:35 -0700 [thread overview]
Message-ID: <20170912040435.GS3521@linux.vnet.ibm.com> (raw)
In-Reply-To: <150517865165.26279.7811625865051741769.stgit@devbox>
On Tue, Sep 12, 2017 at 10:10:51AM +0900, Masami Hiramatsu wrote:
> To enable jump optimized probe with CONFIG_PREEMPT, use
> synchronize_rcu_tasks() to wait for all tasks preempted
> on trampoline code back on track.
>
> Since the jump optimized kprobes can replace multiple
> instructions, there can be tasks which are interrupted
> on the 2nd (or 3rd) instructions. If the kprobe
> replaces those instructions by a jump instruction,
> when those tasks back to the interrupted place, it is
> a middle of the jump instruction and causes a kernel
> panic.
> To avoid such tragedies in advance, kprobe optimizer
> prepare a detour route using normal kprobe (e.g.
> int3 breakpoint on x86), and wait for the tasks which
> is interrrupted on such place by synchronize_sched()
> when CONFIG_PREEMPT=n.
> If CONFIG_PREEMPT=y, things be more complicated, because
> such interrupted thread can be preempted (other thread
> can be scheduled in interrupt handler.) So, kprobes
> optimizer has to wait for those tasks scheduled normally.
> In this case we can use synchronize_rcu_tasks() which
> ensures that all preempted tasks back on track and
> schedule it.
>
> Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> ---
> arch/Kconfig | 2 +-
> kernel/kprobes.c | 18 +++++++++++++-----
> 2 files changed, 14 insertions(+), 6 deletions(-)
>
> diff --git a/arch/Kconfig b/arch/Kconfig
> index 2520ca5b42eb..d495c06ae961 100644
> --- a/arch/Kconfig
> +++ b/arch/Kconfig
> @@ -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
> diff --git a/kernel/kprobes.c b/kernel/kprobes.c
> index a1606a4224e1..6243b8b02511 100644
> --- a/kernel/kprobes.c
> +++ b/kernel/kprobes.c
> @@ -574,12 +574,20 @@ static void kprobe_optimizer(struct work_struct *work)
>
> /*
> * 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.
> + * are done. Because optprobe may modify multiple instructions,
> + * there is a chance that the Nth instruction is interrupted. In that
> + * case, running interrupt can return to the Nth byte of jump
> + * instruction. This can be avoided by waiting for returning of
> + * such interrupts, since (until here) the first byte of the optimized
> + * probe is already replaced with normal kprobe (sw breakpoint) and
> + * all threads which reach to the probed address will hit it and
> + * bypass the copied instructions instead of executing the original.
> + * With CONFIG_PREEMPT, such interrupts can be preepmted. To wait
> + * for such thread, we will use synchronize_rcu_tasks() which ensures
> + * all preeempted tasks are scheduled normally (= not preempted.)
> + * So we can ensure there is no threads preempted at probed address.
> */
> - synchronize_sched();
> + synchronize_rcu_tasks();
>
> /* Step 3: Optimize kprobes after quiesence period */
> do_optimize_kprobes();
>
next prev parent reply other threads:[~2017-09-12 5:27 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-12 1:10 [PATCH -tip v2] Enable optprobe on preepmtive kernel Masami Hiramatsu
2017-09-12 1:10 ` [PATCH -tip v2] kprobes: Use synchronize_rcu_tasks() for optprobe with CONFIG_PREEMPT Masami Hiramatsu
2017-09-12 4:04 ` Paul E. McKenney [this message]
2017-09-14 4:28 ` [lkp-robot] [kprobes] e1ce3eee7d: BUG:using_smp_processor_id()in_preemptible kernel test robot
2017-09-14 4:28 ` kernel test robot
2017-09-14 10:22 ` Masami Hiramatsu
2017-09-14 10:22 ` Masami Hiramatsu
2017-09-15 0:12 ` Masami Hiramatsu
2017-09-15 0:12 ` Masami Hiramatsu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170912040435.GS3521@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=ananth@linux.vnet.ibm.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mhiramat@kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.