3-nd round RFR 6471769: Error: assert(_cur_stack_depth == count_frames(), "cur_stack_depth out of sync")

serguei.spitsyn at oracle.com serguei.spitsyn at oracle.com
Fri Feb 28 11:55:02 PST 2014


On 2/27/14 10:04 PM, David Holmes wrote:
> Hi Serguei,
>
> On 28/02/2014 1:50 PM, serguei.spitsyn at oracle.com wrote:
>> Please, review the fix for:
>>    https://bugs.openjdk.java.net/browse/JDK-6471769
>>
>>
>> Open webrev:
>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2014/hotspot/6471769-JVMTI-DEPTH.3 
>>
>>
>>
>> Summary:
>>
>>    It is another attempt to fix the JTREG com/sun/jdi tests regression
>>    discovered in the first round change.
>>    The fix is to avoid lock synchronization at
>> safepoints(jvmtiEventController.cpp).
>>    Thanks to Dan for catching the problem in the 2-nd round of review!
>
> The basic approach here seems sound.

Thank you for reviewing the fix!

>
> I find the checking for cur->is_VMThread() somewhat overly 
> conservative - if we are at a safepoint, and executing this code, then 
> we must be the VMThread. But ok.

Agreed and simplified. Thanks!

>
> You could also use MutexLockerEx to avoid the need for locked and 
> unlocked paths to a common call, but that's just stylistic. Though if 
> you are grabbing the current thread anyway you can also use the 
> MutexLocker calls that take the thread arg - to avoid a second look-up 
> of the current thread.

Thank you for reminding. I keep forgetting about it.
Will check what is better here, just do not want to rerun the whole testing.
But I'm in favor to make it simpler. :)

Thanks,
Serguei

>
> David
> -----
>
>> Testing:
>>    All tests are passed: nsk.jvmti, nsk.jdi, nsk.jdwp, JTreg com/sun/jdi
>>
>>
>> Thanks,
>> Serguei
>>
>>
>> On 2/27/14 2:00 PM, serguei.spitsyn at oracle.com wrote:
>>> On 2/27/14 1:03 PM, serguei.spitsyn at oracle.com wrote:
>>>> On 2/27/14 12:28 PM, serguei.spitsyn at oracle.com wrote:
>>>>> Dan,
>>>>>
>>>>> Thank you a lot for reviewing this!
>>>>>
>>>>> On 2/27/14 11:09 AM, Daniel D. Daugherty wrote:
>>>>>> On 2/27/14 1:25 AM, serguei.spitsyn at oracle.com wrote:
>>>>>>> Please, review the fix for:
>>>>>>>   https://bugs.openjdk.java.net/browse/JDK-6471769
>>>>>>>
>>>>>>>
>>>>>>> Open webrev:
>>>>>>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2014/hotspot/6471769-JVMTI-DEPTH.2 
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> src/share/vm/runtime/vm_operations.hpp
>>>>>>     No comments.
>>>>>>
>>>>>> src/share/vm/prims/jvmtiEnvBase.hpp
>>>>>>     No comments.
>>>>>>
>>>>>> src/share/vm/prims/jvmtiEnv.cpp
>>>>>>     No comments.
>>>>>>
>>>>>> src/share/vm/prims/jvmtiEnvThreadState.cpp
>>>>>>     No comments.
>>>>>>
>>>>>> src/share/vm/prims/jvmtiEventController.cpp
>>>>>>     JvmtiEventController::set_frame_pop() is called by
>>>>>>     JvmtiEnvThreadState::set_frame_pop() which is called by
>>>>>>     JvmtiEnv::NotifyFramePop().
>>>>>>
>>>>>>     The "MutexLocker mu(JvmtiThreadState_lock)" in
>>>>>>     JvmtiEventController::set_frame_pop() protected the work
>>>>>>     done by JvmtiEventControllerPrivate::set_frame_pop():
>>>>>>
>>>>>>       ets->get_frame_pops()->set(fpop);
>>>>>> recompute_thread_enabled(ets->get_thread()->jvmti_thread_state());
>>>>>
>>>>> Your check is the right thing to do, thanks!
>>>>> I had to explain this more clearly in this 2-nd review request.
>>>>>
>>>>> The approach I've taken here is that all this code paths are executed
>>>>> on the target thread or at a safepoint.
>>>>>
>>>>> It is true for all 3 functions:
>>>>>   set_frame_pop(), clear_frame_pop() and clear_to_frame_pop().
>>>>>
>>>>> And the updated assert guards ensure that it is the case.
>>>>>
>>>>> It could be a good idea to add a No_Safepoint_Verifier for
>>>>> PopFrame() and NotifyFramePop()
>>>>> to make sure the current/target thread does not go to safepoint
>>>>> until it is returned from
>>>>> update_for_pop_top_frame() and set_frame_pop() correspondingly.
>>>>> A No_Safepoint_Verifier can be also needed in the
>>>>> JvmtiExport::post_method_exit().
>>>>>
>>>>> These are all places where these functions are called:
>>>>> prims/jvmtiEnv.cpp:
>>>>> state->env_thread_state(this)->set_frame_pop(frame_number); //
>>>>> JvmtiEnv::NotifyFramePop()
>>>>> prims/jvmtiExport.cpp: ets->clear_frame_pop(cur_frame_number); //
>>>>> JvmtiExport::post_method_exit()
>>>>> prims/jvmtiThreadState.cpp:
>>>>> ets->clear_frame_pop(popframe_number);              //
>>>>> JvmtiThreadState::update_for_pop_top_frame()
>>>>>
>>>>> The function JvmtiEnvThreadState::clear_to_frame_pop() is never
>>>>> called now.
>>>>
>>>> There is still a concern about recompute_thread_enabled().
>>>> If it is normally always protected with the JvmtiThreadState_lock
>>>> then the approach above is not going to work.
>>>> I'm trying to check this now.
>>>
>>> Dan,
>>>
>>> I came to a conclusion that these 3 functions still must be protected
>>> by the JvmtiThreadState_lock when they are called out of a safepoint.
>>> It is a little bit ugly but has to be safe though.
>>>
>>> Please, let me know if you see eny problems with that.
>>> I'll send a new webrev soon.
>>>
>>> Thanks,
>>> Serguei
>>>
>>>
>>>>
>>>> Thanks,
>>>> Serguei
>>>>
>>>>
>>>>>
>>>>> Thanks,
>>>>> Serguei
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>>
>>>>>>     Since multiple threads can call JVM/TI NotifyFramePop() on the
>>>>>>     same target thread, what keeps the threads from messing with
>>>>>>     the list of frame pops simultaneously or messing with the
>>>>>>     thread enabled events bits in parallel?
>>>>>>
>>>>>>     I suspect that this might also be an issue for
>>>>>>     JvmtiEventController::clear_frame_pop() and
>>>>>>     JvmtiEventController::clear_to_frame_pop() also.
>>>>>>
>>>>>> src/share/vm/prims/jvmtiThreadState.cpp
>>>>>>     No comments.
>>>>>>
>>>>>> Dan
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> Summary:
>>>>>>>
>>>>>>>   It is the 2-nd round of review because the JTREG com/sun/jdi
>>>>>>> tests discovered a regression
>>>>>>>   in the first round change. The issue was in the
>>>>>>> JvmtiEventController::clear_frame_pop()
>>>>>>>   lock synchronization that is not allowed at safepoints.
>>>>>>>
>>>>>>>   As a result I've changed the JvmtiEnv::NotifyFramePop to use a
>>>>>>> VM operation for safety.
>>>>>>>   Also, I've removed the lock synchronization from the 3 impacted
>>>>>>> JvmtiEventController::
>>>>>>>   functions: set_frame_pop(), clear_frame_pop() and
>>>>>>> clear_to_frame_pop().
>>>>>>>
>>>>>>> Testing:
>>>>>>>   In progress: nsk.jvmti, nsk.jdi, nsk.jdwp, JTreg com/sun/jdi
>>>>>>>
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Serguei
>>>>>>>
>>>>>>>
>>>>>>> On 2/25/14 12:43 PM, serguei.spitsyn at oracle.com wrote:
>>>>>>>> Please, review the fix for:
>>>>>>>>   https://bugs.openjdk.java.net/browse/JDK-6471769
>>>>>>>>
>>>>>>>>
>>>>>>>> Open webrev:
>>>>>>>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2014/hotspot/6471769-JVMTI-DEPTH.1 
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Summary:
>>>>>>>>
>>>>>>>>   This is another Test Stabilization issue.
>>>>>>>>   The fix is very similar to other JVMTI stabilization fixes.
>>>>>>>>   It is to use safepoints for updating the PopFrame data instead
>>>>>>>> of relying on the
>>>>>>>>   suspend equivalent condition mechanism
>>>>>>>> (JvmtiEnv::is_thread_fully_suspended())
>>>>>>>>   which is not adequate from the reliability point of view.
>>>>>>>>
>>>>>>>> Testing:
>>>>>>>>   In progress: nsk.jvmti, nsk.jdi, nsk.jdwp, JTreg com/sun/jdi
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Serguei
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>



More information about the serviceability-dev mailing list