]> git.karo-electronics.de Git - linux-beck.git/commit
i386: remove bogus comment about memory barrier
authorNick Piggin <npiggin@suse.de>
Sat, 29 Sep 2007 13:28:48 +0000 (15:28 +0200)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Sat, 29 Sep 2007 16:13:59 +0000 (09:13 -0700)
commit4827bbb06e4b59922c2b9bfb13ad1bf936bdebe5
tree206facb68acff39b9cf15559e6e80227f0e12f31
parent1bef7dc00caa7bcbff4fdb55e599e2591461fafa
i386: remove bogus comment about memory barrier

The comment being removed by this patch is incorrect and misleading.

In the following situation:

1. load  ...
2. store 1 -> X
3. wmb
4. rmb
5. load  a <- Y
6. store ...

4 will only ensure ordering of 1 with 5.
3 will only ensure ordering of 2 with 6.

Further, a CPU with strictly in-order stores will still only provide that
2 and 6 are ordered (effectively, it is the same as a weakly ordered CPU
with wmb after every store).

In all cases, 5 may still be executed before 2 is visible to other CPUs!

The additional piece of the puzzle that mb() provides is the store/load
ordering, which fundamentally cannot be achieved with any combination of
rmb()s and wmb()s.

This can be an unexpected result if one expected any sort of global ordering
guarantee to barriers (eg. that the barriers themselves are sequentially
consistent with other types of barriers).  However sfence or lfence barriers
need only provide an ordering partial ordering of memory operations -- Consider
that wmb may be implemented as nothing more than inserting a special barrier
entry in the store queue, or, in the case of x86, it can be a noop as the store
queue is in order. And an rmb may be implemented as a directive to prevent
subsequent loads only so long as their are no previous outstanding loads (while
there could be stores still in store queues).

I can actually see the occasional load/store being reordered around lfence on
my core2. That doesn't prove my above assertions, but it does show the comment
is wrong (unless my program is -- can send it out by request).

So:
   mb() and smp_mb() always have and always will require a full mfence
   or lock prefixed instruction on x86.  And we should remove this comment.

Signed-off-by: Nick Piggin <npiggin@suse.de>
Cc: Paul McKenney <paulmck@us.ibm.com>
Cc: David Howells <dhowells@redhat.com>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/asm-i386/system.h