From: Mathieu Desnoyers <compudj@krystal.dyndns.org>
To: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>,
LKML <linux-kernel@vger.kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Peter Zijlstra <peterz@infradead.org>,
Andrew Morton <akpm@linux-foundation.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Arjan van de Ven <arjan@infradead.org>
Subject: Re: [PATCH 0/3] ring-buffer: less locking and only disable preemption
Date: Mon, 6 Oct 2008 09:53:24 -0400 [thread overview]
Message-ID: <20081006135324.GB1808@Krystal> (raw)
In-Reply-To: <20081005101341.GH29909@elte.hu>
* Ingo Molnar (mingo@elte.hu) wrote:
>
> * Mathieu Desnoyers <compudj@krystal.dyndns.org> wrote:
>
> > explains that code modification on x86 SMP systems is not only a
> > matter of atomicity, but also a matter of not changing the code
> > underneath a running CPU which is making assumptions that it won't
> > change underneath without issuing a synchronizing instruction before
> > the new code is used by the CPU. The scheme you propose here takes
> > care of atomicity, but does not take care of the synchronization
> > problem. A sync_core() would probably be required when such
> > modification is detected.
>
> that's wrong, my scheme protects against these cases: before _any_ code
> is modified we set the redo_pending atomic flag, and make sure that
> previous NMI handlers have stopped executing. (easy enough)
>
Hi Ingo,
Hrm, how will this take care of the following race ?
CPU A CPU B
- NMI fires
- NMI handler checks for
redo_pending flag, == 0
- NMI handler runs code - set redo_pending
about to be modified
- NMI fires
- NMI handler checks redo_pending,
== 1, executes modify_code_redo()
-- race : NMI on A executes code modified by B --
- NMI handler finished running
code about to be modified
Mathieu
> then the atomic update of redo_pending should be a sufficient barrier
> for another CPU to notice the pending transaction.
>
> Note that the cross-CPU modification can still be 'half done' when the
> NMI hits, that's why we execute modify_code_redo() to 'redo' the full
> modification before executing further NMI code. That is executed _on the
> CPU_ that triggers an NMI, and the CPU itself is self-consistent.
>
> ( The modify_code_redo() will have to do a sync_cores() of course, like
> all self-modifying code, to flush speculative execution. )
>
> > Also, speaking of plain atomicity, you scheme does not seem to protect
> > against NMIs running on a different CPU, because the non-atomic change
> > could race with such NMI.
>
> That's wrong too. Another CPU will notice that redo_pending is set and
> will execute modify_code_redo() from its NMI handler _before_ calling
> all the notifiers and other 'wide' code paths.
>
> the only item that needs to be marked 'notrace' is only the highlevel
> do_nmi() handler itself. (as that executes before we have a chance to
> execute modify_code_redo())
>
> So we trade a large, fragile, and unmapped set of NMI-implicated
> codepaths for a very tight and well controlled an easy to maintain
> codepath.
>
> Ingo
>
--
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
next prev parent reply other threads:[~2008-10-06 13:53 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-04 6:00 [PATCH 0/3] ring-buffer: less locking and only disable preemption Steven Rostedt
2008-10-04 6:00 ` [PATCH 1/3] ring-buffer: move page indexes into page headers Steven Rostedt
2008-10-04 6:00 ` [PATCH 2/3] ring-buffer: make reentrant Steven Rostedt
2008-10-04 6:01 ` [PATCH 3/3] ftrace: make some tracers reentrant Steven Rostedt
2008-10-04 8:40 ` [PATCH 0/3] ring-buffer: less locking and only disable preemption Ingo Molnar
2008-10-04 14:34 ` Steven Rostedt
2008-10-04 14:44 ` Ingo Molnar
2008-10-04 17:41 ` Ingo Molnar
2008-10-04 22:27 ` Mathieu Desnoyers
2008-10-04 23:21 ` Steven Rostedt
2008-10-06 17:10 ` Mathieu Desnoyers
2008-10-05 10:13 ` Ingo Molnar
2008-10-06 13:53 ` Mathieu Desnoyers [this message]
2008-10-04 16:33 ` Mathieu Desnoyers
2008-10-04 17:18 ` Steven Rostedt
2008-10-06 17:13 ` Mathieu Desnoyers
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=20081006135324.GB1808@Krystal \
--to=compudj@krystal.dyndns.org \
--cc=akpm@linux-foundation.org \
--cc=arjan@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.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.