From: Nick Piggin <nickpiggin@yahoo.com.au>
To: paulmck@linux.vnet.ibm.com
Cc: Herbert Xu <herbert@gondor.apana.org.au>,
csnook@redhat.com, dhowells@redhat.com,
linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org,
torvalds@linux-foundation.org, netdev@vger.kernel.org,
akpm@linux-foundation.org, ak@suse.de, heiko.carstens@de.ibm.com,
davem@davemloft.net, schwidefsky@de.ibm.com,
wensong@linux-vs.org, horms@verge.net.au, wjiang@resilience.com,
cfriesen@nortel.com, zlynx@acm.org, rpjday@mindspring.com,
jesper.juhl@gmail.com, Arnd Bergmann <arnd@arndb.de>
Subject: Re: [PATCH 6/24] make atomic_read() behave consistently on frv
Date: Wed, 15 Aug 2007 23:30:05 +1000 [thread overview]
Message-ID: <46C2FFDD.5000600@yahoo.com.au> (raw)
In-Reply-To: <20070814170128.GA8243@linux.vnet.ibm.com>
Paul E. McKenney wrote:
> On Tue, Aug 14, 2007 at 03:34:25PM +1000, Nick Piggin wrote:
>>Maybe it is the safe way to go, but it does obscure cases where there
>>is a real need for barriers.
>
>
> I prefer burying barriers into other primitives.
When they should naturally be there, eg. locking or the RCU primitives,
I agree.
I don't like having them scattered in various "just in case" places,
because it makes both the users and the APIs hard to understand and
change.
Especially since several big architectures don't have volatile in their
atomic_get and _set, I think it would be a step backwards to add them in
as a "just in case" thin now (unless there is a better reason).
>>Many atomic operations are allowed to be reordered between CPUs, so
>>I don't have a good idea for the rationale to order them within the
>>CPU (also loads and stores to long and ptr types are not ordered like
>>this, although we do consider those to be atomic operations too).
>>
>>barrier() in a way is like enforcing sequential memory ordering
>>between process and interrupt context, wheras volatile is just
>>enforcing coherency of a single memory location (and as such is
>>cheaper).
>
>
> barrier() is useful, but it has the very painful side-effect of forcing
> the compiler to dump temporaries. So we do need something that is
> not quite so global in effect.
Yep.
>>What do you think of this crazy idea?
>>
>>/* Enforce a compiler barrier for only operations to location X.
>> * Call multiple times to provide an ordering between multiple
>> * memory locations. Other memory operations can be assumed by
>> * the compiler to remain unchanged and may be reordered
>> */
>>#define order(x) asm volatile("" : "+m" (x))
>
>
> There was something very similar discussed earlier in this thread,
> with quite a bit of debate as to exactly what the "m" flag should
> look like. I suggested something similar named ACCESS_ONCE in the
> context of RCU (http://lkml.org/lkml/2007/7/11/664):
Oh, I missed that earlier debate. Will go have a look.
> #define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
>
> The nice thing about this is that it works for both loads and stores.
> Not clear that order() above does this -- I get compiler errors when
> I try something like "b = order(a)" or "order(a) = 1" using gcc 4.1.2.
As Arnd ponted out, order() is not supposed to be an lvalue, but a
statement like the rest of our memory ordering API.
As to your followup question of why to use it over ACCESS_ONCE. I
guess, aside from consistency with the rest of the barrier APIs, you
can use it in other primitives when you don't actually know what the
caller is going to do or if it even will make an access. You could
also use it between calls to _other_ primitives, etc... it just
seems more flexible to me, but I haven't actually used such a thing
in real code...
ACCESS_ONCE doesn't seem as descriptive. What it results in is the
memory location being loaded or stored (presumably once exactly),
but I think the more general underlying idea is a barrier point.
--
SUSE Labs, Novell Inc.
next prev parent reply other threads:[~2007-08-15 13:30 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-08-09 13:41 [PATCH 6/24] make atomic_read() behave consistently on frv Chris Snook
2007-08-09 16:54 ` Chris Snook
2007-08-10 9:23 ` David Howells
2007-08-10 19:54 ` Chris Snook
2007-08-11 0:54 ` Herbert Xu
2007-08-11 4:29 ` Paul E. McKenney
2007-08-13 5:15 ` Herbert Xu
2007-08-13 6:03 ` Paul E. McKenney
2007-08-14 5:34 ` Nick Piggin
2007-08-14 7:26 ` Herbert Xu
2007-08-14 17:01 ` Paul E. McKenney
2007-08-14 22:01 ` Arnd Bergmann
2007-08-14 22:43 ` Paul E. McKenney
2007-08-15 13:29 ` Arnd Bergmann
2007-08-15 15:06 ` Michael Buesch
2007-08-15 13:30 ` Nick Piggin [this message]
2007-08-15 20:15 ` Paul E. McKenney
2007-08-16 1:09 ` Nick Piggin
2007-08-16 2:27 ` Paul E. McKenney
2007-08-11 8:47 ` David Howells
2007-08-13 6:44 ` Chris Snook
2007-08-14 5:42 ` Nick Piggin
2007-08-15 18:51 ` Segher Boessenkool
2007-08-15 19:18 ` Paul E. McKenney
2007-08-15 19:46 ` Segher Boessenkool
2007-08-15 19:59 ` Paul E. McKenney
2007-08-15 20:13 ` Segher Boessenkool
2007-08-15 20:38 ` Paul E. McKenney
2007-08-15 21:15 ` Segher Boessenkool
2007-08-16 1:20 ` Nick Piggin
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=46C2FFDD.5000600@yahoo.com.au \
--to=nickpiggin@yahoo.com.au \
--cc=ak@suse.de \
--cc=akpm@linux-foundation.org \
--cc=arnd@arndb.de \
--cc=cfriesen@nortel.com \
--cc=csnook@redhat.com \
--cc=davem@davemloft.net \
--cc=dhowells@redhat.com \
--cc=heiko.carstens@de.ibm.com \
--cc=herbert@gondor.apana.org.au \
--cc=horms@verge.net.au \
--cc=jesper.juhl@gmail.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=paulmck@linux.vnet.ibm.com \
--cc=rpjday@mindspring.com \
--cc=schwidefsky@de.ibm.com \
--cc=torvalds@linux-foundation.org \
--cc=wensong@linux-vs.org \
--cc=wjiang@resilience.com \
--cc=zlynx@acm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).