On 05/12, Peter Zijlstra wrote: > > On Sat, 2007-05-12 at 20:04 +0400, Oleg Nesterov wrote: > > > > this code roughly does (the only reader does unlock) > > > > READER WRITER > > > > readers = 0; state = 1; > > wmb(); wmb(); > > CHECK(state != 0) CHECK(readers == 0) > > > > We need to ensure that we can't miss both CHECKs. Either reader > > should see RW_MUTEX_READER_SLOW, o writer sees "readers == 0" > > and does not sleep. > > > > In that case both barriers should be converted to smp_mb(). There > > was a _long_ discussion about STORE-MB-LOAD behaviour, and experts > > seem to believe everething is ok. > > Ah, but note that both those CHECK()s have a rmb(), so that ends up > being: > > READER WRITER > > readers = 0; state = 1; > wmb(); wmb(); > > rmb(); rmb(); > if (state != 0) if (readers == 0) > > and a wmb+rmb is a full mb, right?
I used to think the same, but this is wrong: wmb+rmb != mb. wmb+rmb doesn't provide LOAD,STORE or STORE,LOAD ordering. for example, LOAD; rmb(); wmb(); STORE; it is still possible that STORE comes before LOAD. At least this is my understanding. Oleg. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/