Messages in this thread | | | Date | Fri, 17 Jul 2020 17:58:57 -0700 | From | Eric Biggers <> | Subject | Re: [PATCH] tools/memory-model: document the "one-time init" pattern |
| |
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
| |