On Mon, Jan 23, 2023 at 12:34:37PM -0500, Alan Stern wrote: > On Mon, Jan 23, 2023 at 08:40:14AM -0800, Paul E. McKenney wrote: > > In the case, the value read is passed into cmpxchg_relaxed(), which > > checks the value against memory. In this case, as Arjan noted, the only > > compiler-and-silicon difference between data_race() and READ_ONCE() > > is that use of data_race() might allow the compiler to do things like > > tear the load, thus forcing the occasional spurious cmpxchg_relaxed() > > failure. > > Is it possible in theory for a torn load to cause a spurious > cmpxchg_relaxed() success? Or would that not matter here? In this case, the new value is the old value with an additional bit set. There is no check for that bit being clear, so I am having a hard time seeing a difference. Then again, much might depend on the ordering that Hernan is referring to. And Peter Zijlstra's suggestion of set_bit() is quite attractive, give or take the casting issues called out by David Laight. Thanx, Paul