RFR: 8247213: G1: Reduce usage of volatile in favour of Atomic operations
Leo Korinth
leo.korinth at oracle.com
Thu Jun 11 15:51:36 UTC 2020
On 11/06/2020 15:34, David Holmes wrote:
> Hi Leo,
>
> On 11/06/2020 8:47 pm, Leo Korinth wrote:
>> On 11/06/2020 04:58, David Holmes wrote:
>>> Hi Leo,
>>>
>>> On 10/06/2020 11:02 pm, Leo Korinth wrote:
>>>> Hi, I have created a RFR in the hotspot-gc-dev mailing list that
>>>> mostly changes stuff in G1. However I am also doing changes in
>>>> atomic.hpp (mostly adding an AtomicValue<> class) so there might be
>>>> interest outside gc. If you have interest, please follow that thread.
>>>
>>> If you are changing atomic.hpp then please cross-post to
>>> hotspot-runtime-dev. Or even cross-post here on hotspot-dev as there
>>> should be a broad consensus on how to handle this in the VM.
>>
>> That was what I tried to do by sending the email. I want to have the
>> discussion in one place though, so I thought it was better announcing
>> the RFR on hotspot-gc-dev on this mailing list than potentially
>> creating two review threads by cross-posting.
>
> You can't expect all hotspot engineers to subscribe to hotspot-gc-dev to
> have this conversation. Either use a common list, like hotspot-dev (that
> we should all be subscribed to) or else cross-post.
I realize that now --- sorry --- please continue here on hotspot-dev. I
closed the thread on hotspot-gc-dev.
/Leo
>
> Thanks,
> David
> -----
>
>> Next time I will cross post and tell people to reply on hotspot-gc-dev
>> if that is preferable. Is it? I have attached the email below:
>>
>>
>> Hi, could I have a review for this change that adds AtomicValue<> to
>> atomic.hpp and uses it in G1?
>>
>> I am adding an AtomicValue<> to atomic.hpp. This is an opaque type
>> (the "value" is private) and that protect against non-atomic
>> operations being used by mistake. AtomicValue methods are proxied to
>> the corresponding (all-static) Atomic:: methods. All operations are
>> explicitly atomic and in a type safe manner with semantics defined in
>> enum atomic_memory_order
>> (memory_order_conservative by default).
>>
>> Instead of using field variables as volatile, I change them to be of
>> AtomicValue<> type. No need to verify that += (for example) will
>> result in an atomic instruction on all supported compilers.
>>
>> I have some open questions regarding the exported fields in
>> vmStructs_g1.hpp. Today, volatile fields are sometimes "exported" as
>> volatile (and sometimes not, and I guess this is by mistake). I choose
>> to export them all as non-volatile. From what I can see the volatile
>> specific part only casts to void* (only documentation?). Java code is
>> unchanged and still access them as the unwrapped values (static assert
>> in atomic.hpp guarantees that memory layout is the same for T and
>> AtomicValue<T>). I think this is okay, but would like feedback on all
>> this.
>>
>> The change is presented as a two part change. The first part changes
>> all volatile to AtomicValue, the other part removes the AtomicValue
>> part on non-field accesses. By doing it two part I will not forget to
>> transform some operations by mistake.
>>
>> Copyright years will be updated when all other changes are approved.
>>
>> How about pushing this after 15 is branched off and thus have it for 16?
>>
>> Enhancement:
>> https://bugs.openjdk.java.net/browse/JDK-8247213
>>
>> Webrev:
>> http://cr.openjdk.java.net/~lkorinth/8247213/0/part1
>> http://cr.openjdk.java.net/~lkorinth/8247213/0/part2
>> http://cr.openjdk.java.net/~lkorinth/8247213/0/full
>>
>> Testing:
>> tier1-3
>>
>> Thanks,
>> Leo
>>>
>>> Thanks,
>>> David
>>>
>>>> Thanks,
>>>> Leo
More information about the hotspot-dev
mailing list