Re: [PATCH] Document Linux's memory barriers [try #5]

From: Suzanne Wood
Date: Fri Mar 31 2006 - 11:14:12 EST


Thank you.

> From David Howells Fri Mar 31 06:51:59 2006

> Suzanne Wood <suzannew@xxxxxxxxxx> wrote:

> > OK, you can dispense with a store if the value is not used before another
> > store to the same memory location. So if, for some other reason, X = *A
> > goes away, you discard *A = W.

> What I was actually thinking of is:

> *A = Y;
> Z = *A;

> Can be changed by the compiler or the CPU into:

> *A = Y;
> Z = Y;

> Which would eliminate the externally visible "Z = LOAD *A" entirely by
> combination with the store.

> However, that's reintroducing the concept of caching back into the abstract
> CPU again - which complicates things once again.

> I've decided to rewrite what I was trying to say to the attached.

> David


> However, it is guaranteed that a CPU will be self-consistent: it will see its
> _own_ accesses appear to be correctly ordered, without the need for a memory
> barrier. For instance with the following code:

> U = *A;
> *A = V;
> *A = W;
> X = *A;
> *A = Y;
> Z = *A;

> and assuming no intervention by an external influence, it can be assumed that
> the final result will appear to be:

> U == the original value of *A
> X == W
> Z == Y
> *A == Y

> The code above may cause the CPU to generate the full sequence of memory
> accesses:

> U=LOAD *A, STORE *A=V, STORE *A=W, X=LOAD *A, STORE *A=Y, Z=LOAD *A

> in that order, but, without intervention, the sequence may have almost any
> combination of elements combined or discarded, provided the program's view of
> the world remains consistent.

> The compiler may also combine, discard or defer elements of the sequence before
> the CPU even sees them.

> For instance:

> *A = V;
> *A = W;

> may be reduced to:

> *A = W;

> since, without a write barrier, it can be assumed that the effect of the
> storage of V to *A is lost. Similarly:

> *A = Y;
> Z = *A;

> may, without a memory barrier, be reduced to:

> *A = Y;
> Z = Y;

> and the LOAD operation never appear outside of the CPU.

Looks good. Now I can see the gain without a loss.
Thanks.
Suzanne
-
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/