On Tue, Feb 02, 2016 at 12:20:25PM +0000, Will Deacon wrote: > On Tue, Feb 02, 2016 at 08:12:30PM +0800, Boqun Feng wrote: > > On Tue, Feb 02, 2016 at 11:45:59AM +0000, Will Deacon wrote: > > > On Tue, Feb 02, 2016 at 01:19:04PM +0800, Boqun Feng wrote: > > > > On Mon, Feb 01, 2016 at 07:54:58PM -0800, Paul E. McKenney wrote: > > > > > On Mon, Feb 01, 2016 at 01:56:22PM +0000, Will Deacon wrote: > > > > > > On Fri, Jan 29, 2016 at 02:22:53AM -0800, Paul E. McKenney wrote: > > > > > > > On Fri, Jan 29, 2016 at 09:59:59AM +0000, Will Deacon wrote: > > > > > > Locally transitive chain termination: > > > > > > > > > > > > (i.e. these can't be used to extend a chain) > > > > > > > > > > Agreed. > > > > > > > > > > > > o smp_store_release() -> lockless_dereference() (???) > > > > > > > o rcu_assign_pointer() -> rcu_dereference() > > > > > > > o smp_store_release() -> READ_ONCE(); if > > > > > > > > Just want to make sure, this one is actually: > > > > > > > > o smp_store_release() -> READ_ONCE(); if ;<WRITE_ONCE()> > > > > > > > > right? Because control dependency only orders READ->WRITE. > > > > > > > > If so, do we also need to take the following pairing into consideration? > > > > > > > > o smp_store_release() -> READ_ONCE(); if ;smp_rmb(); > > > > <ACCESS_ONCE()> > > > > > > > > > > > > > > I am OK with the first and last, but I believe that the middle one > > > > > has real use cases. So the rcu_assign_pointer() -> rcu_dereference() > > > > > case needs to be locally transitive. > > > > > > > > > > > > > Hmm... I don't think we should differ rcu_dereference() and > > > > lockless_dereference(). One reason: list_for_each_entry_rcu() are using > > > > lockless_dereference() right now, which means we used to think > > > > rcu_dereference() and lockless_dereference() are interchangeable, right? > > > > > > > > Besides, Will, what's the reason of having a locally transitive chain > > > > termination? Because on some architectures RELEASE->DEPENDENCY pairs may > > > > not be locally transitive? > > > > > > Well, the following ISA2 test is permitted on ARM: > > > > > > > > > P0: > > > Wx=1 > > > WyRel=1 // rcu_assign_pointer > > > > > > P1: > > > Ry=1 // rcu_dereference > > > > What if a <addr> dependency is added here? Same result? > > Right, that fixes it. So if we're only considering things like: > > rcu_dereference > <addr> > RELEASE > > then local transitivity should be preserved.
Whew!!! ;-) > I think the same applies to <ctrl>, which seems to match your later > example. Could you please check? Thanx, Paul