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