On 2019-06-26, Peter Zijlstra <[email protected]> wrote: >> Here are the writer-relevant memory barriers and their associated >> variables: >> >> MB1: data_list.oldest >> MB2: data_list.newest >> MB3: data_block.id >> MB4: descr.data_next >> MB5: descr_list.newest >> MB6: descr.next > > I think this is the fundamental divergence in parlance. > > You seem to associate a barrier with a (single) variable, where > normally a barrier is between two (or more) variables.
The litmus tests I posted to answer your previous questions should (hopefully) show that I already understand this. The above list shows the _key_ loads/stores that are used to guarantee ordering (for these and other memory operations). And yes, I now understand that my comments need to list all the operations that are being ordered based on these key loads/stores. > As you wrote in that other email (I'm stlil going through all that); > your MB5 isn't desc_list.newest, but rather between desc_list.newest > and descr.next. Here is where I have massive problems communicating. I don't understand why you say the barrier is _between_ newest and next. I would say the barrier is _on_ newest to _synchronize_ with next (or something). I am struggling with terminology. (To be honest, I'd much rather just post litmus tests.) For example, if we have: WRITE_ONCE(&a, 1); WRITE_ONCE(&b, 1); WRITE_ONCE(&c, 1); smp_store_release(&d, 1); and: local_d = smp_load_acquire(&d); local_a = READ_ONCE(&a); local_b = READ_ONCE(&b); local_c = READ_ONCE(&c); How do you describe that? Do you say the memory barrier is between a and d? Or between a, b, c, d? (a, b, c aren't ordered, but they are one-way synchronized with d). I would say there is a barrier on d to synchronize a, b, c. John Ogness

