Re: [PATCH 0/24] make atomic_read() behave consistently across all architectures
From: Stefan Richter <stefanr@s5r6.in-berlin.de>
Date: 2007-08-16 08:07:10
Also in:
linux-arch, lkml
Herbert Xu wrote:
On Thu, Aug 16, 2007 at 04:56:21PM +1000, Paul Mackerras wrote:quoted
Note that I said these are the cases _where one might want to allow caching_, so of course adding volatile doesn't help _these_ cases. There are of course other cases where one definitely doesn't want to allow the compiler to cache the value, such as when polling an atomic variable waiting for another CPU to change it, and from my inspection so far these cases seem to be the majority.We've been through that already. If it's a busy-wait it should use cpu_relax. If it's scheduling away that already forces the compiler to reread anyway. Do you have an actual example where volatile is needed?quoted
- It matches the normal expectation based on the name "atomic_read" - It matches the behaviour of the other atomic_* primitivesCan't argue since you left out what those expectations or properties are.
We use atomic_t for data that is concurrently locklessly written and read at arbitrary times. My naive expectation as driver author (driver maintainer) is that all atomic_t accessors, including atomic_read, (and atomic bitops) work with the then current value of the atomic data.
quoted
- It avoids bugs in the cases where "volatile" behaviour is requiredDo you (or anyone else for that matter) have an example of this?
The only code I somewhat know, the ieee1394 subsystem, was perhaps authored and is currently maintained with the expectation that each occurrence of atomic_read actually results in a load operation, i.e. is not optimized away. This means all atomic_t (bus generation, packet and buffer refcounts, and some other state variables)* and likewise all atomic bitops in that subsystem. If that assumption is wrong, then what is the API or language primitive to force a load operation to occur? *) Interesting what a quick LXR session in search for all atomic_t usages in 'my' subsystem brings to light. I now noticed an apparently unused struct member in the bitrotting pcilynx driver, and more importantly, a pairing of two atomic_t variables in raw1394 that should be audited for race conditions and for possible replacement by plain int. -- Stefan Richter -=====-=-=== =--- =---- http://arcgraph.de/sr/