Re: [PATCH] tools/memory-model: document the "one-time init" pattern

From: Eric Biggers
Date: Fri Jul 17 2020 - 20:59:14 EST


On Fri, Jul 17, 2020 at 01:53:40PM -0700, Darrick J. Wong wrote:
> > +There are also cases in which the smp_load_acquire() can be replaced by
> > +the more lightweight READ_ONCE(). (smp_store_release() is still
> > +required.) Specifically, if all initialized memory is transitively
> > +reachable from the pointer itself, then there is no control dependency
>
> I don't quite understand what "transitively reachable from the pointer
> itself" means? Does that describe the situation where all the objects
> reachable through the object that the global struct foo pointer points
> at are /only/ reachable via that global pointer?
>

The intent is that "transitively reachable" means that all initialized memory
can be reached by dereferencing the pointer in some way, e.g. p->a->b[5]->c.

It could also be the case that allocating the object initializes some global or
static data, which isn't reachable in that way. Access to that data would then
be a control dependency, which a data dependency barrier wouldn't work for.

It's possible I misunderstood something. (Note the next paragraph does say that
using READ_ONCE() is discouraged, exactly for this reason -- it can be hard to
tell whether it's correct.) Suggestions of what to write here are appreciated.

- Eric