Re: Uses for memory barriers

From: Alan Stern
Date: Fri Sep 08 2006 - 22:23:11 EST


On Sat, 9 Sep 2006, Oliver Neukum wrote:

> > But what _is_ the formal definition of a memory barrier? I've never seen
> > one that was complete and correct.
>
> I' d say "mb();" is "rmb();wmb();"
>
> and they work so that:
>
> CPU 0
>
> a = TRUE;
> wmb();
> b = TRUE;
>
> CPU 1
>
> if (b) {
> rmb();
> assert(a);
> }
>
> is correct. Possibly that is not a complete definition though.

It isn't. Paul has agreed that this assertion:

CPU 0 CPU 1
----- -----
while (x == 0) relax(); x = -1;
x = a; y = b;
mb(); mb();
b = 1; a = 1;
while (x < 0) relax();
assert(x==0 || y==0);

will not fail. I think this would not be true if either of the mb()
statements were replaced with {rmb(); wmb();}.

To put it another way, {rmb(); wmb();} guarantees that any preceding read
will complete before any following read and any preceding write will
complete before any following write. However it does not guarantee that
any preceding read will complete before any following write, whereas mb()
does guarantee that. (To whatever extent these statements make sense.)

Alan

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/