All of lore.kernel.org
 help / color / mirror / Atom feed
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 22:03:28 -0700	[thread overview]
Message-ID: <4518B4A0.6070509@goop.org> (raw)
In-Reply-To: <20060926025924.GA27366@Krystal>

Mathieu Desnoyers wrote:
>> 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.  
>>     
>
> I am not sure about this last statement. The same reference :
> http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/gcc/Extended-Asm.html
>   
(This is pretty old, and this is an area which changes quite a lot.  You 
should refer to something more recent;
http://www.cims.nyu.edu/cgi-systems/info2html?/usr/local/info(gcc)Top 
for example, though in this case the quoted text looks the same.)

> I am just wondering how gcc can assume that I will not modify variables on the
> stack from within a function with a memory clobber. If I would like to do some
> nasty things in my assembly code, like accessing directly to a local variable by
> using an offset from the stack pointer, I would expect gcc not to relocate this
> local variable around my asm volatile memory clobbered statement, as it falls
> under the category "access memory in an unpredictable fashion".
>   

That not really what it means.  gcc is free to put local variables in 
memory or register, and unless you pass the local to your asm as a 
parameter, your code has no way of knowing how to find the current 
location of the local.  You could trash your stack frame from within the 
asm if you like, but I don't think gcc is under any obligation to behave 
in a deterministic way if you do.

"Unpredictable" in this case means that the memory modified isn't easily 
specified as a normal asm parameter.  For example, if you have an asm 
which does a memset(), the modified memory's size is a runtime variable 
rather than a compile-time constant.  Or perhaps your asm follows a 
linked list and modifies memory as it traverses the list.


    J

  reply	other threads:[~2006-09-26  5:03 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
2006-09-26  2:59           ` Mathieu Desnoyers
2006-09-26  5:03             ` Jeremy Fitzhardinge [this message]
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=4518B4A0.6070509@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.