On 05/24/12 15:45, Marcel Moolenaar wrote:
Author: marcel
Date: Thu May 24 20:45:44 2012
New Revision: 235931
URL: http://svn.freebsd.org/changeset/base/235931

Log:
   Fix the memory barriers for CPUs that do not like lwsync and wedge or cause
   exceptions early enough during boot that the kernel will do ithe same.
   Use lwsync only when compiling for LP64 and revert to the more proven isync
   when compiling for ILP32. Note that in the end (i.e. between revision 222198
   and this change) ILP32 changed from using sync to using isync. As per Nathan
   the isync is needed to make sure I/O accesses are properly serialized with
   locks and isync tends to be more effecient than sync.


This badly breaks the synchronization primitives. The functions mb()/wmb()/rmb() need to be sync or lwsync on ILP32, not isync. As the comment notes, isync only provides a barrier in conjunction with the atomic operations and atomic retry loop -- this is why there is a distinction between *mb() and __ATOMIC_*(). Moreover, __ATOMIC_ACQ() *must* be isync, not lwsync, on PPC64 without changes to the bus_space accessors. Using lwsync causes bus space operations to leak across mutex acquisition which causes the expected severe problems on at least my machine.

Summary:
1. *mb() must be lwsync or sync on all machines, except for wmb() which could be eieio 2. __ATOMIC_ACQ() must be isync (though could be reduced to lwsync with bus_space changes)
3. __ATOMIC_REL() must be lwsync or sync
-Nathan
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to