All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: x86 <x86@kernel.org>, linux-kernel <linux-kernel@vger.kernel.org>,
	rostedt <rostedt@goodmis.org>,
	Masami Hiramatsu <mhiramat@kernel.org>,
	bristot <bristot@redhat.com>, jbaron <jbaron@akamai.com>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@kernel.org>, Nadav Amit <namit@vmware.com>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Andy Lutomirski <luto@kernel.org>,
	Ard Biesheuvel <ard.biesheuvel@linaro.org>,
	Josh Poimboeuf <jpoimboe@redhat.com>,
	Jessica Yu <jeyu@kernel.org>,
	Alexei Starovoitov <alexei.starovoitov@gmail.com>,
	paulmck <paulmck@kernel.org>
Subject: Re: [PATCH -v5 12/17] x86/kprobes: Fix ordering
Date: Thu, 14 Nov 2019 10:06:17 -0500 (EST)	[thread overview]
Message-ID: <1135959694.112.1573743977897.JavaMail.zimbra@efficios.com> (raw)
In-Reply-To: <20191114135311.GW4131@hirez.programming.kicks-ass.net>

----- On Nov 14, 2019, at 8:53 AM, Peter Zijlstra peterz@infradead.org wrote:

> On Wed, Nov 13, 2019 at 10:42:32AM -0500, Mathieu Desnoyers wrote:
>> ----- On Nov 11, 2019, at 8:13 AM, Peter Zijlstra peterz@infradead.org 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();
>> 
>> syncrhonize -> synchronize
> 
> Fixed.
> 
>> >	  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
>> 
>> practise -> practice
> 
> And fixed.
> 
>> > 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.
>> 
>> I'm not entirely convinced about this last statement though. AFAIU:
>> 
>> - Swapping between some instruction and INT3 is OK,
>> - Swapping back between that INT3 and _original_ instruction is OK,
>> - Anything else needs to have explicit core serialization.
> 
> So far, agreed.
> 
>> So I understand the part about requiring the synchronize call to guarantee
>> that nobody is then still using the instruction bytes following INT3, but not
>> the rationale for the first synchronization. What operation would theoretically
>> follow this first synchronize call ?
> 
> I'm not completely sure what you're asking, so I'm going to explain too
> much and hope I answered your question along the way. If not, please be
> a little more specific.
> 
> First:
> 
> So what can happen with optimized kprobes is that the original
> instruction is <5 bytes and we want to write a JMP.d32 (5 bytes).
> Something like:
> 
>	83e:   48 89 e5                mov    %rsp,%rbp
>	841:   48 85 c0                test   %rax,%rax
> 
> And we put a kprobe on the MOV. Then we poke INT3 at 0x83e and IPI-sync.
> At that point the kprobe is active:
> 
>	83e:   cc 89 e5                int3 ; 2 byte garbage
>	841:   48 85 c0                test   %rax,%rax
> 
> Now we want to optimize that thing. But imagine a task being preempted
> at 0x841. If we poke in the JMP.d32 the above turns into gibberish
> 
>	83e:   e9 12 34 56 78		jmp +0x12345678
> 
> Then our task resumes, loads the instruction at 0x841, which then reads:
> 
>	841:   56 78 c0
> 
> And goes *bang*.

Thanks for the reminder. I somehow forgot that optimized kprobes covered
instructions smaller than 5 bytes.

> 
> So what we do, after enabling the regular kprobe, is call
> synchronize_rcu_tasks() to wait for each task to have passed through
> schedule(). That guarantees no task is preempted inside the kprobe
> shadow (when it triggers it ensures it resumes execution at an
> instruction boundary further than 5 bytes away).

Indeed, given that synchronize_rcu_tasks() awaits for voluntary context
switches (or user-space execution), it guarantees that no task was preempted
within the kprobe shadow.

Considering that synchronize_rcu_tasks() is meant only for code rewriting,
I wonder if it would make sense to include the core serializing guarantees
within this RCU API ?

> 
> 
> Second:
> 
> The argument I was making was that if we didn't IPI-sync, and if
> synchronize_rcu_tasks() would imply the IPI-sync, we would still need
> two invocations of it to achieve the desired result. Because only after
> the implied IPI-sync must we guarantee no tasks is still inside the
> kprobe 'shadow'.
> 
> 
> Did that answer your question?

Yes.

Which makes me wonder if we should include the IPI-sync guarantees within
synchronize_rcu_tasks(), _and_ issue the additional IPI-sync when a full
synchronize_rcu_tasks() is not required. But this is a minor nit, I'm fine
with the approach you propose.

> 
>> I understand that this patch modifies arch_{arm,disarm}_kprobe to add
>> core serialization after inserting/removing the INT3 even in the case
>> where no optimized kprobes are used, which is heavier than what is
>> strictly required without optimized kprobes.
> 
> I disagree, it is required even for normal kprobes, namely:
> 
> Without this additional sync it is uncertain when the kprobe would've
> taken effect (if ever).
> 
> Suppose a CPU is stuck in a tight loop around the probed instruction,
> then it would never have to re-fetch the changed text and thus never
> trigger.

If the instruction cache state is not presumed to be "eventually
consistent", then this explicit core serialization is indeed required.

Please consider my comments about as food for thoughts, I'm fine with
your proposed patch:

Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>

Thanks!

Mathieu



-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com

  reply	other threads:[~2019-11-14 15:06 UTC|newest]

Thread overview: 115+ 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
2019-11-13 15:42   ` Mathieu Desnoyers
2019-11-14 13:53     ` Peter Zijlstra
2019-11-14 15:06       ` Mathieu Desnoyers [this message]
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-01-22 21:26                 ` Dmitry Osipenko
2020-01-22 21:26                 ` Dmitry Osipenko
2020-02-07 10:17                 ` Peter Zijlstra
2020-02-07 10:17                   ` Peter Zijlstra
2020-02-07 10:17                   ` Peter Zijlstra
2020-02-07 10:26                   ` Peter Zijlstra
2020-02-07 10:26                     ` Peter Zijlstra
2020-02-07 10:26                     ` Peter Zijlstra
2020-02-07 11:27                 ` Peter Zijlstra
2020-02-07 11:27                   ` Peter Zijlstra
     [not found]                   ` <20200207112720.GF14914-Nxj+rRp3nVydTX5a5knrm8zTDFooKrT+cvkQGrU6aU0@public.gmane.org>
2020-02-07 16:47                     ` Dmitry Osipenko
2020-02-07 16:47                       ` Dmitry Osipenko
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=1135959694.112.1573743977897.JavaMail.zimbra@efficios.com \
    --to=mathieu.desnoyers@efficios.com \
    --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=mhiramat@kernel.org \
    --cc=mingo@kernel.org \
    --cc=namit@vmware.com \
    --cc=paulmck@kernel.org \
    --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 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.