On Tue, 5 Nov 2024 23:53:04 GMT, Patricio Chilano Mateo 
<pchilanom...@openjdk.org> wrote:

>> Yes, I see your idea to get rid of the pending unmount event code. Before 
>> commenting on that, note that we still need to check if the freeze failed to 
>> undo the transition, which would call for this RAII object that we currently 
>> have. So in line with your suggestion we could call `VTMS_vthread_mount()` 
>> in `~JvmtiUnmountBeginMark()` which would also do the right thing too. 
>> Something like this: 
>> https://github.com/pchilano/jdk/commit/1729b98f554469fedbbce52333eccea9d1c81514
>> We can go this simplified route, but note that we would post unmount/mount 
>> events even if we never unmounted or remounted because freeze failed. It's 
>> true that that is how it currently works when unmounting from Java fails, so 
>> I guess it's not new behavior.
>> Maybe we could go with this simplified code now and work on it later. I 
>> think the unmount event should be always posted at the end of the 
>> transition, in `JvmtiVTMSTransitionDisabler::VTMS_unmount_end()`. I know 
>> that at that point we have already switched identity to the carrier, but 
>> does the specs say the event has to be posted in the context of the vthread? 
>> If we can do that then we could keep the simplified version and avoid this 
>> extra unmount/mount events.
>
> Regarding the pop_frame/early_ret/async_exception conditions, not checking 
> for them after we started the transition would be an issue.
> For pop_frame/early_ret checks, the problem is that if any of them are 
> installed in `JvmtiUnmountBeginMark()` while trying to start the transition, 
> and later the call to freeze succeeds, when returning to the interpreter 
> (monitorenter case) we will incorrectly follow the JVMTI code [1], instead of 
> going back to `call_VM_preemptable` to clear the stack from the copied 
> frames. As for the asynchronous exception check, if it gets installed in 
> `JvmtiUnmountBeginMark()` while trying to start the transition, the exception 
> would be thrown in the carrier instead, very likely while executing the 
> unmounting logic.
> When unmounting from Java, although the race is also there when starting the 
> VTMS transition as you mentioned, I think the end result will be different. 
> For pop_frame/early_ret we will just bail out if trying to install them since 
> the top frame will be a native method (`notifyJvmtiUnmount`). For the async 
> exception, we would process it on return from `notifyJvmtiUnmount` which 
> would still be done in the context of the vthread.
> 
> [1]  
> https://github.com/openjdk/jdk/blob/471f112bca715d04304cbe35c6ed63df8c7b7fee/src/hotspot/cpu/x86/macroAssembler_x86.cpp#L1629

Thank you for the comment! I'm okay with your modified suggestion in general if 
there are no road blocks.

> but does the specs say the event has to be posted in the context of the 
> vthread?

As Alan said below we do not have an official spec for this but still the 
events need to be posted in vthread context.

> For pop_frame/early_ret checks ...

The pop_frame/early_ret conditions are installed in handshakes with a context 
of `JvmtiVTMSTransitionDisabler`. As you noted the `JVMTI_ERROR_OPAQUE_FRAME` 
might be also returned by the JVMTI `FramePop` and `ForceEarlyReturn*` for some 
specific cases. So, it feels like it should not be a problem. I'm thinking if 
adding an assert at the VTMS transition end would help.

> Maybe we could go with this simplified code now and work on it later...

Whatever works better for you. An alternate approach could be to file an 
enhancement to simplify/refactor this.
It would be nice to fix a couple of nits though:
 - the call to `java_lang_Thread::set_is_in_VTMS_transition()`is not needed in 
`JvmtiUnmountBeginMark`
 - the function `is_vthread_safe_to_preempt()` does not need the `vthread` 
parameter

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/21565#discussion_r1831367766

Reply via email to