RFR: 8186837: Memory ordering nmethod, _state and _stack_traversal_mark
Roman Kennke
rkennke at redhat.com
Wed Aug 30 15:03:43 UTC 2017
OK :-)
Cheers, Roman
Am 30. August 2017 16:50:26 MESZ schrieb Robbin Ehn <robbin.ehn at oracle.com>:
>Hi Roman,
>
>On 08/30/2017 12:14 PM, Roman Kennke wrote:
>> It sounds to me like LA/RL would be required and sufficient on _state
>?
>
>Yes, but
>- Using la/rs just sometimes can be confusing, changing to get/set with
>la/rs semantics also means we need to change assembly to use proper
>memory ordering,
> e.g. lda instead of ldr on aarch64 and armv7 add e.g. ldr, dmb, etc...
>(I asked compiler, their thoughts was dirty reads are most likely okay
>in all other cases since _state only goes 'up')
>- Using la/rs in just this case means either duplicate methods with
>acquire semantic or adding a bool to a lot of methods since these are
>accessed in deep call hierarchies.
>- The write side is using storestore today
>
>For those reasons I said:
>
>> Instead for simplicity the write side storestore fence should be
>match with loadload on read side and the changes to
>_stack_traversal_mark undone (kept it volatile).
>
>I'm well aware this no near perfect, but we need that loadload fence,
>so can you can live with my proposed change?
>And we can discussed the bigger picture in 8186839?
>
>Thanks, Robbin
>
>>
>> Roman
>>
>> Am 29. August 2017 16:50:03 MESZ schrieb Robbin Ehn
><robbin.ehn at oracle.com>:
>>
>> Hi Roman thanks for having a look,
>>
>> On 08/29/2017 03:00 PM, Roman Kennke wrote:
>>
>> Hi Robin,
>>
>> I doubt that we can assume a symmetry between loadload and
>storestore like there is with load-acquire and release-store. This
>doesn't seem right. In my experience
>> loadload
>> and storestore are rather special purpose: loadload ensures
>ordering between otherwise unrelated loads and storestore likewise with
>stores.
>>
>>
>> This exactly why I add loadload, to stop reordering of unrelated
>loads:
>>
>> #######################
>> The original code did:
>>
>> //nmethod::make_not_entrant_or_zombie
>> store _stack_traversal_mark
>> storestore
>> store _state
>>
>> //NMethodSweeper::process_compiled_method
>> load _state
>> load _stack_traversal_mark // this is a none-volatile load, can
>be reordered by both gcc and hardware
>>
>> #######################
>> Adding la/sr + volatile to _stack_traversal_mark:
>>
>> store _stack_traversal_mark release // release not needed, we
>have a following storestore for the unrelated stores
>> storestore
>> store _state
>>
>> load _state
>> load _stack_traversal_mark acquire // acquire not needed since we
>already loaded _state and any following writes/reads will be done after
>we have taken a Mutex.
>>
>> #######################
>> So therefore my conclusion was that, in this particular case:
>>
>> store _stack_traversal_mark
>> storestore
>> store _state
>>
>> load _state
>> loadload
>> load _stack_traversal_mark
>>
>> would be correct, agree?
>>
>> And as I said I have created another jira issue for the concerns
>me, you and David share.
>>
>> Thanks Robbin
>>
>>
>> And even symmetric use of load-acquire and release-store are
>often done wrong: those are not meant to protect concurrent access to
>the field, but to the stuff that is
>> protected by the field access (think locks), I.e. what
>happens between the LA and RS. At least that is my understanding.
>>
>> I suggest to do what David said and try to understand what
>concurrent accesses to which fields we have, and which fences are
>actually needed to ensure correct ordering.
>>
>> And thanks for revisiting this!
>>
>> Cheers, Roman
>>
>> Am 29. August 2017 12:31:17 MESZ schrieb Robbin Ehn
><robbin.ehn at oracle.com>:
>>
>> Hi please review,
>>
>> The issue 8180932 - "Parallelize safepoint cleanup" changed
>_stack_traversal_mark to load acquire/store release, this is at least
>half wrong.
>> Instead for simplicity the write side storestore fence should
>be match with loadload on read side and the changes to
>_stack_traversal_mark undone (kept it volatile).
>>
>> Bug:
>> https://bugs.openjdk.java.net/browse/JDK-8186837
>>
>> Code:
>> http://cr.openjdk.java.net/~rehn/8186837/hotspot.01/webrev/
>>
>> It's not clear in this code if there other concurrent
>dependent read/writes.
>> Is true that only when reading/writing _state and
>_stack_traversal_mark proper memory ordering is needed?
>> To track that I
>created:https://bugs.openjdk.java.net/browse/JDK-8186839
>>
>> Thanks Robbin
>>
>>
>> --
>> Diese Nachricht wurde von meinem Android-Gerät mit K-9 Mail
>gesendet.
>>
>>
>> --
>> Diese Nachricht wurde von meinem Android-Gerät mit K-9 Mail gesendet.
--
Diese Nachricht wurde von meinem Android-Gerät mit K-9 Mail gesendet.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20170830/12c2b166/attachment.html>
More information about the hotspot-compiler-dev
mailing list