RFR: 8275718: Relax memory constraint on exception counter updates
David Holmes
david.holmes at oracle.com
Wed Nov 3 12:23:47 UTC 2021
Correction ...
On 3/11/2021 10:09 pm, David Holmes wrote:
> On 1/11/2021 7:16 pm, Aleksey Shipilev wrote:
>> On Thu, 21 Oct 2021 15:16:28 GMT, Zhengyu Gu <zgu at openjdk.org> wrote:
>>
>>> This is another instance of counter updates that only need atomic
>>> guarantee.
>>
>> (I am not arguing in favor or against this particular change, but I
>> think we can talk a bit about generic stuff here...)
>>
>>> I don't know where this guarantee is coming from. Two r-m-w atomic
>>> ops must have some guarantee via coherence for the atomic op to
>>> actually work. And an implementation could make any atomic r-m-w
>>> implementation ensure global immediate visibility. But you cannot
>>> assume this is guaranteed for all hardware. Even for a given platform
>>> this would need to be a specified guarantee in the architecture
>>> manual, not just something deduced/inferred by reasoning.
>>
>> Hotspot's `memory_order_relaxed` is
>> [aligned](https://github.com/openjdk/jdk/blob/5bb1992b8408a0d196b1afa308bc00d007458dbd/src/hotspot/share/runtime/atomic.hpp#L44-L45)
>> with C++11 atomics semantics. C++11 atomic semantics for relaxed
>> atomic ops requires [single modification order
>> consistency](https://en.cppreference.com/w/cpp/atomic/memory_order#Relaxed_ordering),
>> which implies
>> [coherence](https://en.cppreference.com/w/cpp/atomic/memory_order#Modification_order).
>>
>>
>> All known hardware platforms provide coherence out of the box (they
>> are, indeed, cache-coherent platforms), that's why it is easy to
>> implement in C++ (`mo_relaxed`) and in Java
>> (`VarHandles.(get|set)opaque`).
>>
>> I am always confused by "immediate global visibility". The problem
>> with statements that include "immediate", "before", "after" is that
>> they leak in the notion of time, which is ill-defined for a single
>> memory location without any reference to other variables. Maybe you
>> can expand your concern with the example?
>
> Let me back up to be clear. I stated that memory-order-conservative
> might lower the chances (in a general platform-agnostic way) of seeing a
> stale value, compared to memory-order-relaxed, due to the stronger
> memory fence/barrier operation it implies. The response to that was:
>
> "value updated via atomic r-m-w operation should be visible to other
> threads guaranteed by coherence protocol"
>
> claiming that visibility guarantees were inherently present due to
> coherence regardless of what kind of memory fence/barrier were
> associated with the r-m-w atomic operation. I'm not sure if that is
> actually true. If it is true then we would not need any memory-order
> parameter on the r-m-w atomic operations because they would be all be
> the same due to this underlying coherence property.
No that isn't true. I see now that the C++ "Modification Order"
definition requires the write to the counter to be (for want of a better
term) "immediately visible" to any subsequent read - so no stale value
could be read. That is a far stronger guarantee than I expected from
mo_relaxed. The use of other mo values on the r-m-w atomic operation
impact the ordering between that variable and other atomic variables.
David
-----
> When I said "immediate global visibility" I was referring to a situation
> where once the write in the r-m-w atomic op had occurred then all
> subsequent reads would see the value of that write. It is true that such
> a thing may not require "immediacy" in a temporal sense, but the net
> effect is the same.
>
> David
> -----
>
>> -------------
>>
>> PR: https://git.openjdk.java.net/jdk/pull/6065
>>
More information about the hotspot-dev
mailing list