RFR(S): 8229422: Taskqueue: Outdated selection of weak memory model platforms
David Holmes
david.holmes at oracle.com
Wed Jan 22 11:59:21 UTC 2020
On 22/01/2020 8:52 pm, Andrew Haley wrote:
> On 1/15/20 1:00 AM, David Holmes wrote:
>> On 15/01/2020 2:15 am, Andrew Haley wrote:
>>> On 1/14/20 3:52 PM, Doerr, Martin wrote:
>>>
>>>> good catch. I think you're right. A multi-copy-atomic, but weak
>>>> architecture (e.g. aarch64) needs an instruction which orders both
>>>> volatile loads.
>>>
>>> Good, I thought so.
>>>
>>> Given that TSO machines define OrderAccess::acquire() as no more than
>>> a compiler barrier, I believe that we could do something like
>>>
>>> #ifdef CPU_MULTI_COPY_ATOMIC
>>> OrderAccess::acquire();
>>> #else
>>> OrderAccess::fence();
>>> #endif
>>
>> "acquire" isn't used to order loads it is used to pair with a "release"
>> associated with the store of the variable now being loaded.
>>
>> If this is the code referred to:
>>
>> Age oldAge = _age.get();
>> // Architectures with weak memory model require a barrier here
>> // to guarantee that bottom is not older than age,
>> // which is crucial for the correctness of the algorithm.
>> #ifndef CPU_MULTI_COPY_ATOMIC
>> OrderAccess::fence();
>> #endif
>> uint localBot = Atomic::load_acquire(&_bottom);
>>
>> then I think there is an assumption (perhaps incorrect) that the
>> load_acquire will prevent reordering as well as performing the necessary
>> "acquire" semantics.
>
> It depends on how _age is written to.
>
> As far as I can see there is no ordering between setting _bottom and setting
> _age,
>
> void set_empty() {
> _bottom = 0;
> _age.set(0);
> }
>
> so it looks like any kind of fence on the reader side is pointless anyway. In
> that case, I don't know why we're doing any of this if it doesn't matter
> what order the reader threads see updates to _age and _bottom.
>
> It's all rather baffling. _bottom is declared volatile, as is _age, so I
> guess there must be some ordering requirements, but no fences on the
> writing side to enforce it.
>
> What actually are the ordering requirements between _bottom and _age?
I'm assuming the ordering requirement is to preserve the order as
expressed in the code. There is likely an assumption that by declaring
both as volatile that the the compiler will not reorder them; and that
the load_acquire will prevent the hardware from reordering them. I'm not
sure if either of those assumptions are actually valid.
But that doesn't explain the complete lack of barriers in set_empty.
The GC folk will need to chime in on the detailed semantic requirements
of this algorithm.
David
More information about the hotspot-gc-dev
mailing list