RFR: 8373367: interp-only mechanism fails to work for carrier threads in a corner case [v9]

Serguei Spitsyn sspitsyn at openjdk.org
Wed Feb 25 23:47:18 UTC 2026


On Wed, 25 Feb 2026 21:29:44 GMT, Alex Menkov <amenkov at openjdk.org> wrote:

>> Serguei Spitsyn has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   review: convert a couple of sanity checks into asserts
>
> src/hotspot/share/prims/jvmtiEventController.cpp line 381:
> 
>> 379:   if (target == nullptr ||                                                         // an unmounted virtual thread
>> 380:       JvmtiEnvBase::is_thread_carrying_vthread(target, state->get_thread_oop())) { // a vthread carrying thread
>> 381:     return;  // EnterInterpOnlyModeClosure will be executed right after mount.
> 
> The condition is not clear to me. How we do the deoptimization for mounted vthread?

Thank you for checking.  It can be done in two different ways. The `JvmtiThreadState` of a mounted virtual thread will be used to enter `interp_only_mode` for mounted virtual thread. The `state->get_thread()` has to be non `null` in both cases. 
One way is when virtual thread is currently mounted. The chain of calls is: 
 `SetEventNotificationMode()` =>
 `JvmtiEventControllerPrivate::set_user_enabled()` =>
 `JvmtiEventControllerPrivate::recompute_enabled()` =>
 `JvmtiEventControllerPrivate::recompute_thread_enabled() =>
  `JvmtiEventControllerPrivate::enter_interp_only_mode()` => . . .
   `EnterInterpOnlyModeClosure::do_thread()`

Another way is at a `mount` transition point. The chain of calls is: 
  `JavaThread::rebind_to_jvmti_thread_state_of()` =>
 `JvmtiThreadState::process_pending_interp_only()` =>
 `JvmtiEventController::enter_interp_only_mode()` => 
 `EnterInterpOnlyModeClosure::do_thread()`

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

PR Review Comment: https://git.openjdk.org/jdk/pull/29436#discussion_r2856056603


More information about the serviceability-dev mailing list