+ Whenever any CPU C' executes an unlock operation U such thatThe barrier is never mentioned in this document. This is a relatively
+ CPU C executes a lock operation L followed by a po-later
+ smp_mb__after_unlock_lock() fence, and L is either a later lock
+ operation on the lock released by U or is po-after U, then any
+ store that propagates to C' before U must propagate to all other
+ CPUs before any instructions po-after the fence are executed on C.
oddball/rare barrier. Also, IMO, this description doesn't add much to
the notions of execution and propagation being introduced. I'd rather
move it (or parts of it) to ODDS AND ENDS where smp_mb__after_spinlock()
and other smp_mb__*() are currently briefly described.
Indeed I don't mean po-earlier, and agree it should be clarified.+While smp_wmb() and release fences only force certain earlier storesIf "earlier" means po-earlier, this statement is wrong, cf. the comment
+to propagate to another CPU C' before certain later stores propagate
+to the same CPU C',
about A-cumulativity. IAC, it should be clarified.
(Same as above)
strong fences and smp_mb__after_unlock_lock()Switching back to "execution order" I guess; need clarification.
+force those stores to propagate to all other CPUs before any later
+instruction is executed. We collectively refer to the latter
+operations as strong ordering operations, as they provide much
+stronger ordering in two ways:
+
+ Firstly, strong ordering operations also create order between
+ earlier stores and later reads.
+[lots of renaming unless I missed something]
+ Secondly, strong ordering operations create a form of global
+ ordering: When an earlier store W propagates to CPU C and is
+ ordered by a strong ordering operation with a store W' of C,
+ and another CPU C' observes W' and in response issues yet
+ another store W'', then W'' also can not propagate to any CPU
+ before W. By contrast, a release fence or smp_wmb() would only
+ order W and W', but not force any ordering between W and W''.
+ To summarize, the ordering forced by strong ordering operations
+ extends to later stores of all CPUs, while other fences only
+ force ordering with relation to stores on the CPU that executes
+ the fence.
+
+The propagation ordering enforced by release fences and strong ordering
+operations affects stores from other CPUs that propagate to CPU C before
+the fence is executed, as well as stores that are executed on C before
+the fence. We describe this property by saying that release fences and
+strong ordering operations are A-cumulative. By contrast, smp_wmb()
+fences are not A-cumulative; they only affect the propagation of stores
+that are executed on C before the fence (i.e., those which precede the
+fence in program order).