public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@kernel.org>
To: Peter Zijlstra <peterz@infradead.org>
Cc: x86@kernel.org, linux-kernel@vger.kernel.org,
	rostedt@goodmis.org, mhiramat@kernel.org, bristot@redhat.com,
	jbaron@akamai.com, torvalds@linux-foundation.org,
	tglx@linutronix.de, mingo@kernel.org, namit@vmware.com,
	hpa@zytor.com, luto@kernel.org, ard.biesheuvel@linaro.org,
	jpoimboe@redhat.com, jeyu@kernel.org,
	alexei.starovoitov@gmail.com, mathieu.desnoyers@efficios.com
Subject: Re: [PATCH -v5 12/17] x86/kprobes: Fix ordering
Date: Wed, 13 Nov 2019 06:31:41 -0800	[thread overview]
Message-ID: <20191113143140.GD2865@paulmck-ThinkPad-P72> (raw)
In-Reply-To: <20191111132458.162172862@infradead.org>

On Mon, Nov 11, 2019 at 02:13:04PM +0100, Peter Zijlstra wrote:
> Kprobes does something like:
> 
> register:
> 	arch_arm_kprobe()
> 	  text_poke(INT3)
>           /* guarantees nothing, INT3 will become visible at some point, maybe */
> 
>         kprobe_optimizer()
> 	  /* guarantees the bytes after INT3 are unused */
> 	  syncrhonize_rcu_tasks();
> 	  text_poke_bp(JMP32);
> 	  /* implies IPI-sync, kprobe really is enabled */
> 
> 
> unregister:
> 	__disarm_kprobe()
> 	  unoptimize_kprobe()
> 	    text_poke_bp(INT3 + tail);
> 	    /* implies IPI-sync, so tail is guaranteed visible */
>           arch_disarm_kprobe()
>             text_poke(old);
> 	    /* guarantees nothing, old will maybe become visible */
> 
> 	synchronize_rcu()
> 
>         free-stuff
> 
> Now the problem is that on register, the synchronize_rcu_tasks() does
> not imply sufficient to guarantee all CPUs have already observed INT3
> (although in practise this is exceedingly unlikely not to have
> happened) (similar to how MEMBARRIER_CMD_PRIVATE_EXPEDITED does not
> imply MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE).
> 
> Worse, even if it did, we'd have to do 2 synchronize calls to provide
> the guarantee we're looking for, the first to ensure INT3 is visible,
> the second to guarantee nobody is then still using the instruction
> bytes after INT3.
> 
> Similar on unregister; the synchronize_rcu() between
> __unregister_kprobe_top() and __unregister_kprobe_bottom() does not
> guarantee all CPUs are free of the INT3 (and observe the old text).
> 
> Therefore, sprinkle some IPI-sync love around. This guarantees that
> all CPUs agree on the text and RCU once again provides the required
> guaranteed.
> 
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
> Cc: hpa@zytor.com
> Cc: paulmck@kernel.org

With a phrase like "IPI-sync love" in the commit log...  ;-)

Acked-by: Paul E. McKenney <paulmck@kernel.org>

> Cc: mathieu.desnoyers@efficios.com
> ---
>  arch/x86/include/asm/text-patching.h |    1 +
>  arch/x86/kernel/alternative.c        |   11 ++++++++---
>  arch/x86/kernel/kprobes/core.c       |    2 ++
>  arch/x86/kernel/kprobes/opt.c        |   12 ++++--------
>  4 files changed, 15 insertions(+), 11 deletions(-)
> 
> --- a/arch/x86/include/asm/text-patching.h
> +++ b/arch/x86/include/asm/text-patching.h
> @@ -42,6 +42,7 @@ extern void text_poke_early(void *addr,
>   * an inconsistent instruction while you patch.
>   */
>  extern void *text_poke(void *addr, const void *opcode, size_t len);
> +extern void text_poke_sync(void);
>  extern void *text_poke_kgdb(void *addr, const void *opcode, size_t len);
>  extern int poke_int3_handler(struct pt_regs *regs);
>  extern void text_poke_bp(void *addr, const void *opcode, size_t len, const void *emulate);
> --- a/arch/x86/kernel/alternative.c
> +++ b/arch/x86/kernel/alternative.c
> @@ -936,6 +936,11 @@ static void do_sync_core(void *info)
>  	sync_core();
>  }
>  
> +void text_poke_sync(void)
> +{
> +	on_each_cpu(do_sync_core, NULL, 1);
> +}
> +
>  struct text_poke_loc {
>  	s32 rel_addr; /* addr := _stext + rel_addr */
>  	s32 rel32;
> @@ -1085,7 +1090,7 @@ static void text_poke_bp_batch(struct te
>  	for (i = 0; i < nr_entries; i++)
>  		text_poke(text_poke_addr(&tp[i]), &int3, sizeof(int3));
>  
> -	on_each_cpu(do_sync_core, NULL, 1);
> +	text_poke_sync();
>  
>  	/*
>  	 * Second step: update all but the first byte of the patched range.
> @@ -1107,7 +1112,7 @@ static void text_poke_bp_batch(struct te
>  		 * not necessary and we'd be safe even without it. But
>  		 * better safe than sorry (plus there's not only Intel).
>  		 */
> -		on_each_cpu(do_sync_core, NULL, 1);
> +		text_poke_sync();
>  	}
>  
>  	/*
> @@ -1123,7 +1128,7 @@ static void text_poke_bp_batch(struct te
>  	}
>  
>  	if (do_sync)
> -		on_each_cpu(do_sync_core, NULL, 1);
> +		text_poke_sync();
>  
>  	/*
>  	 * sync_core() implies an smp_mb() and orders this store against
> --- a/arch/x86/kernel/kprobes/core.c
> +++ b/arch/x86/kernel/kprobes/core.c
> @@ -502,11 +502,13 @@ int arch_prepare_kprobe(struct kprobe *p
>  void arch_arm_kprobe(struct kprobe *p)
>  {
>  	text_poke(p->addr, ((unsigned char []){INT3_INSN_OPCODE}), 1);
> +	text_poke_sync();
>  }
>  
>  void arch_disarm_kprobe(struct kprobe *p)
>  {
>  	text_poke(p->addr, &p->opcode, 1);
> +	text_poke_sync();
>  }
>  
>  void arch_remove_kprobe(struct kprobe *p)
> --- a/arch/x86/kernel/kprobes/opt.c
> +++ b/arch/x86/kernel/kprobes/opt.c
> @@ -444,14 +444,10 @@ void arch_optimize_kprobes(struct list_h
>  /* Replace a relative jump with a breakpoint (int3).  */
>  void arch_unoptimize_kprobe(struct optimized_kprobe *op)
>  {
> -	u8 insn_buff[JMP32_INSN_SIZE];
> -
> -	/* Set int3 to first byte for kprobes */
> -	insn_buff[0] = INT3_INSN_OPCODE;
> -	memcpy(insn_buff + 1, op->optinsn.copied_insn, DISP32_SIZE);
> -
> -	text_poke_bp(op->kp.addr, insn_buff, JMP32_INSN_SIZE,
> -		     text_gen_insn(JMP32_INSN_OPCODE, op->kp.addr, op->optinsn.insn));
> +	arch_arm_kprobe(&op->kp);
> +	text_poke(op->kp.addr + INT3_INSN_SIZE,
> +		  op->optinsn.copied_insn, DISP32_SIZE);
> +	text_poke_sync();
>  }
>  
>  /*
> 
> 

  reply	other threads:[~2019-11-13 14:31 UTC|newest]

Thread overview: 106+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-11 13:12 [PATCH -v5 00/17] Rewrite x86/ftrace to use text_poke (and more) Peter Zijlstra
2019-11-11 13:12 ` [PATCH -v5 01/17] x86/alternatives: Teach text_poke_bp() to emulate instructions Peter Zijlstra
2019-11-15  9:43   ` [tip: core/kprobes] " tip-bot2 for Peter Zijlstra
2019-11-11 13:12 ` [PATCH -v5 02/17] x86/alternatives: Update int3_emulate_push() comment Peter Zijlstra
2019-11-15  9:43   ` [tip: core/kprobes] " tip-bot2 for Peter Zijlstra
2019-12-04  8:33   ` tip-bot2 for Peter Zijlstra
2019-11-11 13:12 ` [PATCH -v5 03/17] x86/alternatives,jump_label: Provide better text_poke() batching interface Peter Zijlstra
2019-11-15  9:43   ` [tip: core/kprobes] x86/alternatives, jump_label: " tip-bot2 for Peter Zijlstra
2019-12-04  8:33   ` tip-bot2 for Peter Zijlstra
2019-11-11 13:12 ` [PATCH -v5 04/17] x86/alternatives: Add and use text_gen_insn() helper Peter Zijlstra
2019-11-12 17:10   ` Steven Rostedt
2019-11-12 22:25     ` Peter Zijlstra
2019-11-15  9:43   ` [tip: core/kprobes] " tip-bot2 for Peter Zijlstra
2019-12-04  8:33   ` tip-bot2 for Peter Zijlstra
2019-11-11 13:12 ` [PATCH -v5 05/17] x86/ftrace: Use text_poke() Peter Zijlstra
2019-11-12 18:25   ` Steven Rostedt
2019-11-12 22:24     ` Peter Zijlstra
2019-11-12 22:48       ` Steven Rostedt
2019-11-13  9:01         ` Peter Zijlstra
2019-11-13 14:27           ` Steven Rostedt
2019-11-14 13:18             ` Peter Zijlstra
2019-11-14 13:56               ` Steven Rostedt
2019-11-14 14:05                 ` Peter Zijlstra
2019-11-13  8:53       ` Peter Zijlstra
2019-11-15  9:43   ` [tip: core/kprobes] " tip-bot2 for Peter Zijlstra
2019-11-16 20:46     ` Borislav Petkov
2019-11-18 17:35       ` [PATCH] x86/ftrace: Mark ftrace_modify_code_direct() __ref Borislav Petkov
2019-11-18 17:52         ` Steven Rostedt
2019-11-19  9:55       ` [tip: core/kprobes] " tip-bot2 for Borislav Petkov
2019-12-04  8:33       ` tip-bot2 for Borislav Petkov
2019-12-04  8:33   ` [tip: core/kprobes] x86/ftrace: Use text_poke() tip-bot2 for Peter Zijlstra
2019-11-11 13:12 ` [PATCH -v5 06/17] x86/mm: Remove set_kernel_text_r[ow]() Peter Zijlstra
2019-11-15  9:43   ` [tip: core/kprobes] " tip-bot2 for Peter Zijlstra
2019-12-04  8:33   ` tip-bot2 for Peter Zijlstra
2019-11-11 13:12 ` [PATCH -v5 07/17] x86/alternative: Add text_opcode_size() Peter Zijlstra
2019-11-15  9:43   ` [tip: core/kprobes] " tip-bot2 for Peter Zijlstra
2019-12-04  8:33   ` tip-bot2 for Peter Zijlstra
2019-11-11 13:13 ` [PATCH -v5 08/17] x86/ftrace: Use text_gen_insn() Peter Zijlstra
2019-11-15  9:43   ` [tip: core/kprobes] " tip-bot2 for Peter Zijlstra
2019-12-04  8:33   ` tip-bot2 for Peter Zijlstra
2019-11-11 13:13 ` [PATCH -v5 09/17] x86/alternative: Remove text_poke_loc::len Peter Zijlstra
2019-11-15  9:43   ` [tip: core/kprobes] " tip-bot2 for Peter Zijlstra
2019-12-04  8:33   ` tip-bot2 for Peter Zijlstra
2019-11-11 13:13 ` [PATCH -v5 10/17] x86/alternative: Shrink text_poke_loc Peter Zijlstra
2019-11-15  9:43   ` [tip: core/kprobes] " tip-bot2 for Peter Zijlstra
2019-12-04  8:33   ` tip-bot2 for Peter Zijlstra
2019-11-11 13:13 ` [PATCH -v5 11/17] x86/kprobes: Convert to text-patching.h Peter Zijlstra
2019-11-19 16:56   ` [tip: core/kprobes] " tip-bot2 for Peter Zijlstra
2019-12-04  8:33   ` tip-bot2 for Peter Zijlstra
2019-11-11 13:13 ` [PATCH -v5 12/17] x86/kprobes: Fix ordering Peter Zijlstra
2019-11-13 14:31   ` Paul E. McKenney [this message]
2019-11-13 15:42   ` Mathieu Desnoyers
2019-11-14 13:53     ` Peter Zijlstra
2019-11-14 15:06       ` Mathieu Desnoyers
2019-11-14 15:13         ` Paul E. McKenney
2019-11-14 15:22           ` Mathieu Desnoyers
2019-11-14 15:28             ` Peter Zijlstra
2019-11-14 15:30               ` Mathieu Desnoyers
2019-11-14 15:42                 ` Peter Zijlstra
2019-11-14 15:58                   ` Peter Zijlstra
2019-11-19 16:56   ` [tip: core/kprobes] x86/kprobes: Fix ordering while text-patching tip-bot2 for Peter Zijlstra
2019-12-04  8:33   ` tip-bot2 for Peter Zijlstra
2019-11-11 13:13 ` [PATCH -v5 13/17] arm/ftrace: Use __patch_text_real() Peter Zijlstra
2019-11-11 16:47   ` Will Deacon
2019-11-11 17:19     ` Peter Zijlstra
2019-11-11 17:25       ` Peter Zijlstra
2019-11-12 11:29         ` Will Deacon
2019-11-13  9:26           ` [PATCH -v5mkII 13/17] arm/ftrace: Use __patch_text() Peter Zijlstra
2019-11-19 16:56             ` [tip: core/kprobes] " tip-bot2 for Peter Zijlstra
2019-12-04  8:33             ` tip-bot2 for Peter Zijlstra
2020-01-22 21:26               ` Dmitry Osipenko
2020-02-07 10:17                 ` Peter Zijlstra
2020-02-07 10:26                   ` Peter Zijlstra
2020-02-07 11:27                 ` Peter Zijlstra
2020-02-07 16:47                   ` Dmitry Osipenko
2020-01-08 12:22             ` [PATCH -v5mkII 13/17] " Arnd Bergmann
2020-01-08 14:16               ` Steven Rostedt
2020-01-08 14:22                 ` Arnd Bergmann
2019-11-11 13:13 ` [PATCH -v5 14/17] module: Remove set_all_modules_text_*() Peter Zijlstra
2019-11-19 16:56   ` [tip: core/kprobes] " tip-bot2 for Peter Zijlstra
2019-12-04  8:33   ` tip-bot2 for Peter Zijlstra
2019-11-11 13:13 ` [PATCH -v5 15/17] ftrace: Rework event_create_dir() Peter Zijlstra
2019-11-14 14:07   ` Steven Rostedt
2019-11-19 16:56   ` [tip: core/kprobes] " tip-bot2 for Peter Zijlstra
2019-12-04  8:33   ` tip-bot2 for Peter Zijlstra
2019-11-11 13:13 ` [PATCH -v5 16/17] x86/kprobe: Add comments to arch_{,un}optimize_kprobes() Peter Zijlstra
2019-11-19 16:56   ` [tip: core/kprobes] " tip-bot2 for Peter Zijlstra
2019-12-04  8:33   ` tip-bot2 for Peter Zijlstra
2019-11-11 13:13 ` [PATCH -v5 17/17] x86/alternative: Use INT3_INSN_SIZE Peter Zijlstra
2019-11-19 16:56   ` [tip: core/kprobes] x86/alternatives: " tip-bot2 for Peter Zijlstra
2019-12-04  8:33   ` tip-bot2 for Peter Zijlstra
2019-11-11 19:47 ` [PATCH -v5 00/17] Rewrite x86/ftrace to use text_poke (and more) Alexei Starovoitov
2019-11-11 20:39   ` Peter Zijlstra
2019-11-11 20:42   ` Peter Zijlstra
2019-11-11 20:56     ` Alexei Starovoitov
2019-11-12 18:26 ` Steven Rostedt
2019-11-25  3:55 ` Masami Hiramatsu
2019-11-25  6:47   ` Masami Hiramatsu
2019-11-25 17:32   ` Steven Rostedt
2019-11-26  0:11     ` Masami Hiramatsu
2019-11-26  8:58       ` Masami Hiramatsu
2019-11-26  9:58         ` Masami Hiramatsu
2019-11-26 23:48           ` Masami Hiramatsu
     [not found]             ` <CAADnVQK4twuXzFhD-qLHmCVK0n1h-GDENQLu+4PVV3Hp++R6kQ@mail.gmail.com>
2019-11-27  4:32               ` Alexei Starovoitov
2019-11-27  5:01                 ` Alexei Starovoitov
2019-11-27  6:41                 ` 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=20191113143140.GD2865@paulmck-ThinkPad-P72 \
    --to=paulmck@kernel.org \
    --cc=alexei.starovoitov@gmail.com \
    --cc=ard.biesheuvel@linaro.org \
    --cc=bristot@redhat.com \
    --cc=hpa@zytor.com \
    --cc=jbaron@akamai.com \
    --cc=jeyu@kernel.org \
    --cc=jpoimboe@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mhiramat@kernel.org \
    --cc=mingo@kernel.org \
    --cc=namit@vmware.com \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=x86@kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox