RFR: 8261391: ZGC crash - SEGV in RevokeOneBias::do_thread
Robbin Ehn
rehn at openjdk.java.net
Wed Feb 17 10:27:45 UTC 2021
On Wed, 17 Feb 2021 10:21:06 GMT, Robbin Ehn <rehn at openjdk.org> wrote:
>> src/hotspot/share/runtime/handshake.cpp line 541:
>>
>>> 539: }
>>> 540:
>>> 541: op->prepare(_handshakee, current_thread);
>>
>> Okay, just I'm clear on this fix:
>> - You are replacing this single `StackWatermarkSet::start_processing` call on the handshakee with a call to the new prepare() function.
>> - The new prepare() function always does the `StackWatermarkSet::start_processing` call on the `current_target` which is the handshakee.
>> - The new prepare() function does a `StackWatermarkSet::start_processing` call on executioner/executer/executing_thread when that thread is different than the requester/handshaker thread.
>>
>> So you have multiple names for the "target": `target`, `handshakee`, and `current_target`. Is there a reason to create the new name `current_target` instead of using either `target` or `handshakee` that you've used before? Since `current_target` is new name in this fix, I would like to see that one renamed to either `target` or `handshakee` in this fix.
>>
>> I think you also have multiple names for the "requester": `requester` and `handshaker`, but I'm less confused by that naming. In this fix, you're now adding a new name: `executioner` which could be called `executer` or `executing_thread`.
>>
>> Perhaps you could clean up this naming confusion is follow-up RFE that _only_ fixes naming.
>
> 1: Request the handshake
> - The thread doing this is the owner of the handshake operation
> - Handles in the handshake operation belongs to this thread and we must do SWS::start_proc() on it
>
> 2: Target thread(s)
> - The thread(s) which the operation is performed on
> - We must do SWS::start_proc() on it
>
> 3: Executer of the handshake
> - The thread the executes the code that the handshake operation contains.
>
> Handshake operation:
> _requester is the thread requested the operation
> _target is NULL if we target all threads, otherwise it is the target thread.
>
> The prepare() method is part of the handshake operation and need some additional information.
> It needs to know the thread executing the handshake and it needs the current target (since _target may be NULL).
>
> The HandshakeState name for the thread owning the handshake state is handshakee, which is a private implementation detail.
> When the handshake state is processing handshakes it calls prepare with _handshakee as current_target and current_thread as parameters to prepare().
>
> target may be NULL
> current target may not be NULL
> handshakee refers to the handshake state owner (not the target of a handshake operation)
>
> They are thus not interchangeable, but at the moment of execution they can all refer to the same thread.
I now see that I missed call prepare when executing the handshake by handshakee, fixing!
-------------
PR: https://git.openjdk.java.net/jdk/pull/2571
More information about the hotspot-runtime-dev
mailing list