On Mon, Aug 13, 2007 at 07:04:15AM -0400, Chris Snook wrote: > From: Chris Snook <[EMAIL PROTECTED]> > > Document proper use of volatile for atomic_t operations.
Looks good, as did a once-over on the arch-specific files. Good stuff!!! Acked-by: Paul E. McKenney <[EMAIL PROTECTED]> > Signed-off-by: Chris Snook <[EMAIL PROTECTED]> > > --- linux-2.6.23-rc3-orig/Documentation/atomic_ops.txt 2007-07-08 > 19:32:17.000000000 -0400 > +++ linux-2.6.23-rc3/Documentation/atomic_ops.txt 2007-08-13 > 03:36:43.000000000 -0400 > @@ -12,13 +12,20 @@ > C integer type will fail. Something like the following should > suffice: > > - typedef struct { volatile int counter; } atomic_t; > + typedef struct { int counter; } atomic_t; > + > + Historically, counter has been declared as a volatile int. This > +is now discouraged in favor of explicitly casting it as volatile where > +volatile behavior is required. Most architectures will only require such > +a cast in atomic_read() and atomic_set(), as well as their 64-bit versions > +if applicable, since the more complex atomic operations directly or > +indirectly use assembly that results in volatile behavior. > > The first operations to implement for atomic_t's are the > initializers and plain reads. > > #define ATOMIC_INIT(i) { (i) } > - #define atomic_set(v, i) ((v)->counter = (i)) > + #define atomic_set(v, i) (*(volatile int *)&(v)->counter = (i)) > > The first macro is used in definitions, such as: > > @@ -38,7 +45,7 @@ > > Next, we have: > > - #define atomic_read(v) ((v)->counter) > + #define atomic_read(v) (*(volatile int *)&(v)->counter) > > which simply reads the current value of the counter. > - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/