From: Peter Zijlstra <peterz@infradead.org>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: linux-kernel@vger.kernel.org, Ingo Molnar <mingo@elte.hu>,
Andrew Morton <akpm@linux-foundation.org>,
Frederic Weisbecker <fweisbec@gmail.com>,
Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>,
"H. Peter Anvin" <hpa@zytor.com>, Dave Jones <davej@redhat.com>,
Andi Kleen <ak@linux.intel.com>
Subject: Re: [PATCH 1/5] ftrace: Synchronize variable setting with breakpoints
Date: Thu, 31 May 2012 19:28:58 +0200 [thread overview]
Message-ID: <1338485338.28384.85.camel@twins> (raw)
In-Reply-To: <1338473302.13348.336.camel@gandalf.stny.rr.com>
On Thu, 2012-05-31 at 10:08 -0400, Steven Rostedt wrote:
> On Thu, 2012-05-31 at 13:06 +0200, Peter Zijlstra wrote:
> > On Wed, 2012-05-30 at 21:28 -0400, Steven Rostedt wrote:
> > > From: Steven Rostedt <srostedt@redhat.com>
> > >
> > > When the function tracer starts modifying the code via breakpoints
> > > it sets a variable (modifying_ftrace_code) to inform the breakpoint
> > > handler to call the ftrace int3 code.
> > >
> > > But there's no synchronization between setting this code and the
> > > handler, thus it is possible for the handler to be called on another
> > > CPU before it sees the variable. This will cause a kernel crash as
> > > the int3 handler will not know what to do with it.
> > >
> > > I originally added smp_mb()'s to force the visibility of the variable
> > > but H. Peter Anvin suggested that I just make it atomic.
> >
> > Uhm,. maybe. atomic_{inc,dec}() implies a full memory barrier on x86,
>
> Yeah, I believe (and H. Peter can correct me) that this is all that's
> required for x86.
>
> > but atomic_read() never has the smp_rmb() required.
> >
> > Now smp_rmb() is mostly a nop on x86, except for CONFIG_X86_PPRO_FENCE.
>
> No rmb() is required, as that's supplied by the breakpoint itself.
> Basically, rmb() is used for ordering:
>
> load(A);
> rmb();
> loab(B);
>
> To keep the machine from actually doing:
>
> load(B);
> load(A);
I know what rmb is for.. I also know you need to pair barriers. Hiding
them in atomic doesn't make the ordering any more obvious.
> But what this is:
>
> <breakpoint>
> |
> +---------> <handler>
> |
> load(A);
>
> We need the load(A) to be after the breakpoint. Is it possible for the
> machine to do it before?:
>
> load(A)
> |
> |
> <breakpoint>
> +----------> test(A)
I don't know, nor did you explain the implicit ordering there. Also in
such diagrams you need the other side as well.
> If another breakpoint is hit (one other than one put in by ftrace) then
> we don't care. It wont crash the system whether or not A is 1 or 0. We
> just need to make sure that a ftrace breakpoint that is hit knows that
> it was a ftrace breakpoint (calls the ftrace handler). No other
> breakpoint should be on a ftrace nop anyway.
So the ordering is like:
---
CPU-0 CPU-1
lock inc mod-count /* implicit (w)mb */
write int3
<trap-int3> /* implicit (r)mb */
load mod-count
sync-ipi-broadcast
write rest-of-instruction
sync-ipi-broadcast
write head-of-instruction
sync-ipi-broadcast
lock dec mod-count /* implicit (w)mb */
Such that when we observe the int3 on CPU-1 we also must see the
increment on mod-count.
---
A simple something like the above makes it very clear what we're doing
and what we're expecting. I think a (local) trap should imply a barrier
of sorts but will have to defer to others (hpa?) to confirm. But at the
very least write it down someplace that you are assuming that.
fwiw run_sync() could do with a much bigger comment on why its sane to
enable interrupts.. That simply reeks, enabling interrupts too early can
wreck stuff properly.
next prev parent reply other threads:[~2012-05-31 17:29 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-31 1:28 [PATCH 0/5] [GIT PULL] ftrace: Fix bug with function tracing and lockdep Steven Rostedt
2012-05-31 1:28 ` [PATCH 1/5] ftrace: Synchronize variable setting with breakpoints Steven Rostedt
2012-05-31 11:06 ` Peter Zijlstra
2012-05-31 14:08 ` Steven Rostedt
2012-05-31 15:16 ` Masami Hiramatsu
2012-05-31 15:29 ` Steven Rostedt
2012-05-31 17:28 ` Peter Zijlstra [this message]
2012-05-31 18:42 ` Steven Rostedt
2012-05-31 17:40 ` Peter Zijlstra
2012-05-31 17:44 ` Peter Zijlstra
2012-05-31 17:53 ` Steven Rostedt
2012-05-31 18:03 ` Peter Zijlstra
2012-05-31 18:50 ` Steven Rostedt
2012-05-31 19:06 ` Peter Zijlstra
2012-05-31 19:55 ` Mathieu Desnoyers
2012-05-31 20:10 ` Steven Rostedt
2012-05-31 20:26 ` Peter Zijlstra
2012-05-31 20:37 ` Steven Rostedt
2012-05-31 20:40 ` Steven Rostedt
2012-05-31 20:40 ` Peter Zijlstra
2012-05-31 20:49 ` Steven Rostedt
2012-06-01 4:53 ` Masami Hiramatsu
2012-06-01 11:37 ` Steven Rostedt
2012-06-01 12:52 ` Masami Hiramatsu
2012-06-01 0:45 ` Arnaldo Carvalho de Melo
2012-05-31 1:28 ` [PATCH 2/5] ftrace: Use breakpoint method to update ftrace caller Steven Rostedt
2012-05-31 11:18 ` Peter Zijlstra
2012-05-31 14:19 ` Steven Rostedt
2012-05-31 1:28 ` [PATCH 3/5] x86: Reset the debug_stack update counter Steven Rostedt
2012-05-31 19:19 ` H. Peter Anvin
2012-05-31 19:26 ` Steven Rostedt
2012-05-31 1:28 ` [PATCH 4/5] x86: Allow nesting of the debug stack IDT setting Steven Rostedt
2012-05-31 18:44 ` H. Peter Anvin
2012-05-31 18:58 ` H. Peter Anvin
2012-05-31 19:25 ` Steven Rostedt
2012-05-31 19:27 ` H. Peter Anvin
2012-05-31 20:00 ` Steven Rostedt
2012-05-31 20:17 ` H. Peter Anvin
2012-05-31 20:35 ` Steven Rostedt
2012-05-31 20:39 ` H. Peter Anvin
2012-05-31 20:56 ` Steven Rostedt
2012-05-31 21:09 ` H. Peter Anvin
2012-05-31 21:37 ` Steven Rostedt
2012-05-31 21:38 ` Steven Rostedt
2012-06-01 2:30 ` Steven Rostedt
2012-05-31 1:28 ` [PATCH 5/5] ftrace/x86: Do not change stacks in DEBUG when calling lockdep Steven Rostedt
2012-05-31 2:13 ` [PATCH 0/5] (for 3.5)[GIT PULL] ftrace: Fix bug with function tracing and lockdep Steven Rostedt
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=1338485338.28384.85.camel@twins \
--to=peterz@infradead.org \
--cc=ak@linux.intel.com \
--cc=akpm@linux-foundation.org \
--cc=davej@redhat.com \
--cc=fweisbec@gmail.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=masami.hiramatsu.pt@hitachi.com \
--cc=mingo@elte.hu \
--cc=rostedt@goodmis.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.