memory-barriers: Retain barrier() in fold-to-zero example

The transformation in the fold-to-zero example incorrectly omits the
barrier() directive.  This commit therefore adds it back in.

Reported-by: Pranith Kumar <pranith@gatech.edu>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
This commit is contained in:
Paul E. McKenney 2014-08-04 11:49:34 -07:00
parent 5646f7acc9
commit efdcd51a4d
1 changed files with 6 additions and 3 deletions

View File

@ -679,12 +679,15 @@ equal to zero, in which case the compiler is within its rights to
transform the above code into the following: transform the above code into the following:
q = ACCESS_ONCE(a); q = ACCESS_ONCE(a);
barrier();
ACCESS_ONCE(b) = p; ACCESS_ONCE(b) = p;
do_something_else(); do_something_else();
This transformation loses the ordering between the load from variable 'a' This transformation fails to require that the CPU respect the ordering
and the store to variable 'b'. If you are relying on this ordering, you between the load from variable 'a' and the store to variable 'b'.
should do something like the following: Yes, the barrier() is still there, but it affects only the compiler,
not the CPU. Therefore, if you are relying on this ordering, you should
do something like the following:
q = ACCESS_ONCE(a); q = ACCESS_ONCE(a);
BUILD_BUG_ON(MAX <= 1); /* Order load from a with store to b. */ BUILD_BUG_ON(MAX <= 1); /* Order load from a with store to b. */