Re: [RFC][PATCH 0/5] arch: atomic rework
From: Linus Torvalds <torvalds@linux-foundation.org>
Date: 2014-02-18 17:44:51
Also in:
lkml
On Tue, Feb 18, 2014 at 8:17 AM, Torvald Riegel [off-list ref] wrote:
quoted
"Consume operation: no reads in the current thread dependent on the value currently loaded can be reordered before this load"I can't remember seeing that language in the standard (ie, C or C++). Where is this from?
That's just for googling for explanations. I do have some old standard draft, but that doesn't have any concise definitions anywhere that I could find.
quoted
and it could make a compiler writer say that value speculation is still valid, if you do it like this (with "ptr" being the atomic variable): value = ptr->val;I assume the load from ptr has mo_consume ordering?
Yes.
quoted
into tmp = ptr; value = speculated.value; if (unlikely(tmp != &speculated)) value = tmp->value; which is still bogus. The load of "ptr" does happen before the load of "value = speculated->value" in the instruction stream, but it would still result in the CPU possibly moving the value read before the pointer read at least on ARM and power.And surprise, in the C/C++ model the load from ptr is sequenced-before the load from speculated, but there's no ordering constraint on the reads-from relation for the value load if you use mo_consume on the ptr load. Thus, the transformed code has less ordering constraints than the original code, and we arrive at the same outcome.
Ok, good.
The standard is clear on what's required. I strongly suggest reading the formalization of the memory model by Batty et al.
Can you point to it? Because I can find a draft standard, and it sure
as hell does *not* contain any clarity of the model. It has a *lot* of
verbiage, but it's pretty much impossible to actually understand, even
for somebody who really understands memory ordering.
Linus