RFR(S) 8238585: Use handshake for JvmtiEventControllerPrivate::enter_interp_only_mode() and don't make compiled methods on stack not_entrant
Yasumasa Suenaga
suenaga at oss.nttdata.com
Fri Apr 24 15:23:06 UTC 2020
Hi Richard,
On 2020/04/24 23:44, Reingruber, Richard wrote:
> Hi Yasumasa,
>
>> I will send review request to replace VM_SetFramePop to handshake in early next week in JDK-8242427.
>> Does it help you? I think it gives you to remove workaround.
>
> I think it would not help that much. Note that when replacing VM_SetFramePop with a direct handshake
> you could not just execute VM_EnterInterpOnlyMode as a nested vm operation [1]. So you would have to
> change/replace VM_EnterInterpOnlyMode and I would have to adapt to these changes.
Thanks for your information.
I tested my patch with both vmTestbase/nsk/jvmti/PopFrame and vmTestbase/nsk/jvmti/NotifyFramePop.
I will modify and will test it after yours.
> Also my first impression was that it won't be that easy from a synchronization point of view to
> replace VM_SetFramePop with a direct handshake. E.g. VM_SetFramePop::doit() indirectly calls
> JvmtiEventController::set_frame_pop(JvmtiEnvThreadState *ets, JvmtiFramePop fpop) where
> JvmtiThreadState_lock is acquired with safepoint check, if not at safepoint. It's not directly clear
> to me, how this has to be handled.
I think JvmtiEventController::set_frame_pop() should hold JvmtiThreadState_lock because it affects other JVMTI operation especially FramePop event.
Thanks,
Yasumasa
> So it appears to me that it would be easier to push JDK-8242427 after this (JDK-8238585).
>
>> (The patch is available, but I want to see the result of PIT in this weekend whether JDK-8242425 works fine.)
>
> Would be interesting to see how you handled the issues above :)
>
> Thanks, Richard.
>
> [1] See question in comment https://bugs.openjdk.java.net/browse/JDK-8230594?focusedCommentId=14302030&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14302030
>
> -----Original Message-----
> From: Yasumasa Suenaga <suenaga at oss.nttdata.com>
> Sent: Freitag, 24. April 2020 13:34
> To: Reingruber, Richard <richard.reingruber at sap.com>; Patricio Chilano <patricio.chilano.mateo at oracle.com>; serguei.spitsyn at oracle.com; Vladimir Ivanov <vladimir.x.ivanov at oracle.com>; serviceability-dev at openjdk.java.net; hotspot-compiler-dev at openjdk.java.net; hotspot-dev at openjdk.java.net; hotspot-runtime-dev at openjdk.java.net; hotspot-gc-dev at openjdk.java.net
> Subject: Re: RFR(S) 8238585: Use handshake for JvmtiEventControllerPrivate::enter_interp_only_mode() and don't make compiled methods on stack not_entrant
>
> Hi Richard,
>
> I will send review request to replace VM_SetFramePop to handshake in early next week in JDK-8242427.
> Does it help you? I think it gives you to remove workaround.
>
> (The patch is available, but I want to see the result of PIT in this weekend whether JDK-8242425 works fine.)
>
>
> Thanks,
>
> Yasumasa
>
>
> On 2020/04/24 17:18, Reingruber, Richard wrote:
>> Hi Patricio, Vladimir, and Serguei,
>>
>> now that direct handshakes are available, I've updated the patch to make use of them.
>>
>> In addition I have done some clean-up changes I missed in the first webrev.
>>
>> Finally I have implemented the workaround suggested by Patricio to avoid nesting the handshake
>> into the vm operation VM_SetFramePop [1]
>>
>> Kindly review again:
>>
>> Webrev: http://cr.openjdk.java.net/~rrich/webrevs/8238585/webrev.1/
>> Webrev(delta): http://cr.openjdk.java.net/~rrich/webrevs/8238585/webrev.1.inc/
>>
>> I updated the JBS item explaining why the vm operation VM_EnterInterpOnlyMode can be replaced with a
>> direct handshake:
>>
>> JBS: https://bugs.openjdk.java.net/browse/JDK-8238585
>>
>> Testing:
>>
>> * JCK and JTREG tests, also in Xcomp mode with fastdebug and release builds on all platforms.
>>
>> * Submit-repo: mach5-one-rrich-JDK-8238585-20200423-1436-10441737
>>
>> Thanks,
>> Richard.
>>
>> [1] An assertion in Handshake::execute_direct() fails, if called be VMThread, because it is no JavaThread.
>>
>> -----Original Message-----
>> From: hotspot-dev <hotspot-dev-bounces at openjdk.java.net> On Behalf Of Reingruber, Richard
>> Sent: Freitag, 14. Februar 2020 19:47
>> To: Patricio Chilano <patricio.chilano.mateo at oracle.com>; serviceability-dev at openjdk.java.net; hotspot-compiler-dev at openjdk.java.net; hotspot-dev at openjdk.java.net; hotspot-runtime-dev at openjdk.java.net; hotspot-gc-dev at openjdk.java.net
>> Subject: RE: RFR(S) 8238585: Use handshake for JvmtiEventControllerPrivate::enter_interp_only_mode() and don't make compiled methods on stack not_entrant
>>
>> Hi Patricio,
>>
>> > > I'm really glad you noticed the problematic nesting. This seems to be a general issue: currently a
>> > > handshake cannot be nested in a vm operation. Maybe it should be asserted in the
>> > > Handshake::execute() methods that they are not called by the vm thread evaluating a vm operation?
>> > >
>> > > > Alternatively I think you could do something similar to what we do in
>> > > > Deoptimization::deoptimize_all_marked():
>> > > >
>> > > > EnterInterpOnlyModeClosure hs;
>> > > > if (SafepointSynchronize::is_at_safepoint()) {
>> > > > hs.do_thread(state->get_thread());
>> > > > } else {
>> > > > Handshake::execute(&hs, state->get_thread());
>> > > > }
>> > > > (you could pass “EnterInterpOnlyModeClosure” directly to the
>> > > > HandshakeClosure() constructor)
>> > >
>> > > Maybe this could be used also in the Handshake::execute() methods as general solution?
>> > Right, we could also do that. Avoiding to clear the polling page in
>> > HandshakeState::clear_handshake() should be enough to fix this issue and
>> > execute a handshake inside a safepoint, but adding that "if" statement
>> > in Hanshake::execute() sounds good to avoid all the extra code that we
>> > go through when executing a handshake. I filed 8239084 to make that change.
>>
>> Thanks for taking care of this and creating the RFE.
>>
>> >
>> > > > I don’t know JVMTI code so I’m not sure if VM_EnterInterpOnlyMode is
>> > > > always called in a nested operation or just sometimes.
>> > >
>> > > At least one execution path without vm operation exists:
>> > >
>> > > JvmtiEventControllerPrivate::enter_interp_only_mode(JvmtiThreadState *) : void
>> > > JvmtiEventControllerPrivate::recompute_thread_enabled(JvmtiThreadState *) : jlong
>> > > JvmtiEventControllerPrivate::recompute_enabled() : void
>> > > JvmtiEventControllerPrivate::change_field_watch(jvmtiEvent, bool) : void (2 matches)
>> > > JvmtiEventController::change_field_watch(jvmtiEvent, bool) : void
>> > > JvmtiEnv::SetFieldAccessWatch(fieldDescriptor *) : jvmtiError
>> > > jvmti_SetFieldAccessWatch(jvmtiEnv *, jclass, jfieldID) : jvmtiError
>> > >
>> > > I tend to revert back to VM_EnterInterpOnlyMode as it wasn't my main intent to replace it with a
>> > > handshake, but to avoid making the compiled methods on stack not_entrant.... unless I'm further
>> > > encouraged to do it with a handshake :)
>> > Ah! I think you can still do it with a handshake with the
>> > Deoptimization::deoptimize_all_marked() like solution. I can change the
>> > if-else statement with just the Handshake::execute() call in 8239084.
>> > But up to you. : )
>>
>> Well, I think that's enough encouragement :)
>> I'll wait for 8239084 and try then again.
>> (no urgency and all)
>>
>> Thanks,
>> Richard.
>>
>> -----Original Message-----
>> From: Patricio Chilano <patricio.chilano.mateo at oracle.com>
>> Sent: Freitag, 14. Februar 2020 15:54
>> To: Reingruber, Richard <richard.reingruber at sap.com>; serviceability-dev at openjdk.java.net; hotspot-compiler-dev at openjdk.java.net; hotspot-dev at openjdk.java.net; hotspot-runtime-dev at openjdk.java.net; hotspot-gc-dev at openjdk.java.net
>> Subject: Re: RFR(S) 8238585: Use handshake for JvmtiEventControllerPrivate::enter_interp_only_mode() and don't make compiled methods on stack not_entrant
>>
>> Hi Richard,
>>
>> On 2/14/20 9:58 AM, Reingruber, Richard wrote:
>>> Hi Patricio,
>>>
>>> thanks for having a look.
>>>
>>> > I’m only commenting on the handshake changes.
>>> > I see that operation VM_EnterInterpOnlyMode can be called inside
>>> > operation VM_SetFramePop which also allows nested operations. Here is a
>>> > comment in VM_SetFramePop definition:
>>> >
>>> > // Nested operation must be allowed for the VM_EnterInterpOnlyMode that is
>>> > // called from the JvmtiEventControllerPrivate::recompute_thread_enabled.
>>> >
>>> > So if we change VM_EnterInterpOnlyMode to be a handshake, then now we
>>> > could have a handshake inside a safepoint operation. The issue I see
>>> > there is that at the end of the handshake the polling page of the target
>>> > thread could be disarmed. So if the target thread happens to be in a
>>> > blocked state just transiently and wakes up then it will not stop for
>>> > the ongoing safepoint. Maybe I can file an RFE to assert that the
>>> > polling page is armed at the beginning of disarm_safepoint().
>>>
>>> I'm really glad you noticed the problematic nesting. This seems to be a general issue: currently a
>>> handshake cannot be nested in a vm operation. Maybe it should be asserted in the
>>> Handshake::execute() methods that they are not called by the vm thread evaluating a vm operation?
>>>
>>> > Alternatively I think you could do something similar to what we do in
>>> > Deoptimization::deoptimize_all_marked():
>>> >
>>> > EnterInterpOnlyModeClosure hs;
>>> > if (SafepointSynchronize::is_at_safepoint()) {
>>> > hs.do_thread(state->get_thread());
>>> > } else {
>>> > Handshake::execute(&hs, state->get_thread());
>>> > }
>>> > (you could pass “EnterInterpOnlyModeClosure” directly to the
>>> > HandshakeClosure() constructor)
>>>
>>> Maybe this could be used also in the Handshake::execute() methods as general solution?
>> Right, we could also do that. Avoiding to clear the polling page in
>> HandshakeState::clear_handshake() should be enough to fix this issue and
>> execute a handshake inside a safepoint, but adding that "if" statement
>> in Hanshake::execute() sounds good to avoid all the extra code that we
>> go through when executing a handshake. I filed 8239084 to make that change.
>>
>>> > I don’t know JVMTI code so I’m not sure if VM_EnterInterpOnlyMode is
>>> > always called in a nested operation or just sometimes.
>>>
>>> At least one execution path without vm operation exists:
>>>
>>> JvmtiEventControllerPrivate::enter_interp_only_mode(JvmtiThreadState *) : void
>>> JvmtiEventControllerPrivate::recompute_thread_enabled(JvmtiThreadState *) : jlong
>>> JvmtiEventControllerPrivate::recompute_enabled() : void
>>> JvmtiEventControllerPrivate::change_field_watch(jvmtiEvent, bool) : void (2 matches)
>>> JvmtiEventController::change_field_watch(jvmtiEvent, bool) : void
>>> JvmtiEnv::SetFieldAccessWatch(fieldDescriptor *) : jvmtiError
>>> jvmti_SetFieldAccessWatch(jvmtiEnv *, jclass, jfieldID) : jvmtiError
>>>
>>> I tend to revert back to VM_EnterInterpOnlyMode as it wasn't my main intent to replace it with a
>>> handshake, but to avoid making the compiled methods on stack not_entrant.... unless I'm further
>>> encouraged to do it with a handshake :)
>> Ah! I think you can still do it with a handshake with the
>> Deoptimization::deoptimize_all_marked() like solution. I can change the
>> if-else statement with just the Handshake::execute() call in 8239084.
>> But up to you. : )
>>
>> Thanks,
>> Patricio
>>> Thanks again,
>>> Richard.
>>>
>>> -----Original Message-----
>>> From: Patricio Chilano <patricio.chilano.mateo at oracle.com>
>>> Sent: Donnerstag, 13. Februar 2020 18:47
>>> To: Reingruber, Richard <richard.reingruber at sap.com>; serviceability-dev at openjdk.java.net; hotspot-compiler-dev at openjdk.java.net; hotspot-dev at openjdk.java.net; hotspot-runtime-dev at openjdk.java.net; hotspot-gc-dev at openjdk.java.net
>>> Subject: Re: RFR(S) 8238585: Use handshake for JvmtiEventControllerPrivate::enter_interp_only_mode() and don't make compiled methods on stack not_entrant
>>>
>>> Hi Richard,
>>>
>>> I’m only commenting on the handshake changes.
>>> I see that operation VM_EnterInterpOnlyMode can be called inside
>>> operation VM_SetFramePop which also allows nested operations. Here is a
>>> comment in VM_SetFramePop definition:
>>>
>>> // Nested operation must be allowed for the VM_EnterInterpOnlyMode that is
>>> // called from the JvmtiEventControllerPrivate::recompute_thread_enabled.
>>>
>>> So if we change VM_EnterInterpOnlyMode to be a handshake, then now we
>>> could have a handshake inside a safepoint operation. The issue I see
>>> there is that at the end of the handshake the polling page of the target
>>> thread could be disarmed. So if the target thread happens to be in a
>>> blocked state just transiently and wakes up then it will not stop for
>>> the ongoing safepoint. Maybe I can file an RFE to assert that the
>>> polling page is armed at the beginning of disarm_safepoint().
>>>
>>> I think one option could be to remove
>>> SafepointMechanism::disarm_if_needed() in
>>> HandshakeState::clear_handshake() and let each JavaThread disarm itself
>>> for the handshake case.
>>>
>>> Alternatively I think you could do something similar to what we do in
>>> Deoptimization::deoptimize_all_marked():
>>>
>>> EnterInterpOnlyModeClosure hs;
>>> if (SafepointSynchronize::is_at_safepoint()) {
>>> hs.do_thread(state->get_thread());
>>> } else {
>>> Handshake::execute(&hs, state->get_thread());
>>> }
>>> (you could pass “EnterInterpOnlyModeClosure” directly to the
>>> HandshakeClosure() constructor)
>>>
>>> I don’t know JVMTI code so I’m not sure if VM_EnterInterpOnlyMode is
>>> always called in a nested operation or just sometimes.
>>>
>>> Thanks,
>>> Patricio
>>>
>>> On 2/12/20 7:23 AM, Reingruber, Richard wrote:
>>>> // Repost including hotspot runtime and gc lists.
>>>> // Dean Long suggested to do so, because the enhancement replaces a vm operation
>>>> // with a handshake.
>>>> // Original thread: http://mail.openjdk.java.net/pipermail/serviceability-dev/2020-February/030359.html
>>>>
>>>> Hi,
>>>>
>>>> could I please get reviews for this small enhancement in hotspot's jvmti implementation:
>>>>
>>>> Webrev: http://cr.openjdk.java.net/~rrich/webrevs/8238585/webrev.0/
>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8238585
>>>>
>>>> The change avoids making all compiled methods on stack not_entrant when switching a java thread to
>>>> interpreter only execution for jvmti purposes. It is sufficient to deoptimize the compiled frames on stack.
>>>>
>>>> Additionally a handshake is used instead of a vm operation to walk the stack and do the deoptimizations.
>>>>
>>>> Testing: JCK and JTREG tests, also in Xcomp mode with fastdebug and release builds on all platforms.
>>>>
>>>> Thanks, Richard.
>>>>
>>>> See also my question if anyone knows a reason for making the compiled methods not_entrant:
>>>> http://mail.openjdk.java.net/pipermail/serviceability-dev/2020-January/030339.html
>>
More information about the hotspot-compiler-dev
mailing list