From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Mathieu Desnoyers <compudj@krystal.dyndns.org>
Cc: Martin Bligh <mbligh@google.com>,
"Frank Ch. Eigler" <fche@redhat.com>,
Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>,
prasanna@in.ibm.com, Andrew Morton <akpm@osdl.org>,
Ingo Molnar <mingo@elte.hu>, Paul Mundt <lethal@linux-sh.org>,
linux-kernel <linux-kernel@vger.kernel.org>,
Jes Sorensen <jes@sgi.com>, Tom Zanussi <zanussi@us.ibm.com>,
Richard J Moore <richardj_moore@uk.ibm.com>,
Michel Dagenais <michel.dagenais@polymtl.ca>,
Christoph Hellwig <hch@infradead.org>,
Greg Kroah-Hartman <gregkh@suse.de>,
Thomas Gleixner <tglx@linutronix.de>,
William Cohen <wcohen@redhat.com>,
ltt-dev@shafik.org, systemtap@sources.redhat.com,
Alan Cox <alan@lxorguk.ukuu.org.uk>,
Karim Yaghmour <karim@opersys.com>, Pavel Machek <pavel@suse.cz>,
Joe Perches <joe@perches.com>,
"Randy.Dunlap" <rdunlap@xenotime.net>,
"Jose R. Santos" <jrs@us.ibm.com>
Subject: Re: [PATCH] Linux Kernel Markers 0.13 for 2.6.17
Date: Mon, 25 Sep 2006 18:02:06 -0700 [thread overview]
Message-ID: <45187C0E.1080601@goop.org> (raw)
In-Reply-To: <20060926004535.GA2978@Krystal>
Mathieu Desnoyers wrote:
> To protect code from being preempted, the macros preempt_disable and
> preempt_enable must normally be used. Logically, this macro must make sure gcc
> doesn't interleave preemptible code and non-preemptible code.
>
No, it only needs to prevent globally visible side-effects from being
moved into/out of preemptable blocks. In practice that means memory
updates (including the implicit ones that calls to external functions
are assumed to make).
> Which makes me think that if I put barriers around my asm, call, asm trio, no
> other code will be interleaved. Is it right ?
>
No global side effects, but code with local side effects could be moved
around without changing the meaning of preempt.
For example:
int foo;
extern int global;
foo = some_function();
foo += 42;
preempt_disable();
// stuff
preempt_enable();
global = foo;
foo += other_thing();
Assume here that some_function and other_function are extern, and so gcc
has no insight into their behaviour and therefore conservatively assumes
they have global side-effects.
The memory barriers in preempt_disable/enable will prevent gcc from
moving any of the function calls into the non-preemptable region. But
because "foo" is local and isn't visible to any other code, there's no
reason why the "foo += 42" couldn't move into the preempt region.
Likewise, the assignment to "global" can't move out of the range between
the preempt_enable and the call to other_thing().
So in your case, if your equivalent of the non-preemptable block is the
call to the marker function, then there's a good chance that the
compiler might decide to move some other code in there.
Now it might be possible to take the addresses of labels to inhibit code
motion into a particular range:
{
__label__ before, after;
asm volatile("" : : "m" (*&&before), "m" (*&&after)); // gcc can't know what we're doing with the labels
before: ;
// stuff
after: ;
}
but that might be risky for several reasons: I don't know of any
particular promises gcc makes in this circumstance; I suspect taking the
address of a label will have a pretty severe inhibition on what
optimisations gcc's is willing to use (it may prevent inlining
altogether); and this looks pretty unusual, so there could be bugs.
J
next prev parent reply other threads:[~2006-09-26 1:02 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-09-25 23:33 [PATCH] Linux Kernel Markers 0.13 for 2.6.17 Mathieu Desnoyers
2006-09-25 23:56 ` Mathieu Desnoyers
2006-09-26 0:16 ` Jeremy Fitzhardinge
2006-09-26 0:25 ` Mathieu Desnoyers
2006-09-26 0:45 ` Mathieu Desnoyers
2006-09-26 1:02 ` Jeremy Fitzhardinge [this message]
2006-09-26 2:59 ` Mathieu Desnoyers
2006-09-26 5:03 ` Jeremy Fitzhardinge
2006-09-26 18:04 ` Mathieu Desnoyers
2006-09-26 18:57 ` Jeremy Fitzhardinge
2006-09-26 19:08 ` Mathieu Desnoyers
2006-09-26 19:49 ` Frank Ch. Eigler
2006-09-26 20:05 ` Mathieu Desnoyers
2006-09-26 0:06 ` Jeremy Fitzhardinge
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=45187C0E.1080601@goop.org \
--to=jeremy@goop.org \
--cc=akpm@osdl.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=compudj@krystal.dyndns.org \
--cc=fche@redhat.com \
--cc=gregkh@suse.de \
--cc=hch@infradead.org \
--cc=jes@sgi.com \
--cc=joe@perches.com \
--cc=jrs@us.ibm.com \
--cc=karim@opersys.com \
--cc=lethal@linux-sh.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ltt-dev@shafik.org \
--cc=masami.hiramatsu.pt@hitachi.com \
--cc=mbligh@google.com \
--cc=michel.dagenais@polymtl.ca \
--cc=mingo@elte.hu \
--cc=pavel@suse.cz \
--cc=prasanna@in.ibm.com \
--cc=rdunlap@xenotime.net \
--cc=richardj_moore@uk.ibm.com \
--cc=systemtap@sources.redhat.com \
--cc=tglx@linutronix.de \
--cc=wcohen@redhat.com \
--cc=zanussi@us.ibm.com \
/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.