RFR(s): 8228758: assert(_no_handle_mark_nesting == 0) failed: allocating handle inside NoHandleMark
Daniel D. Daugherty
daniel.daugherty at oracle.com
Tue Sep 3 20:38:47 UTC 2019
Just jumping in with a comment on one point below...
On 9/3/19 8:43 AM, Robbin Ehn wrote:
> Hi David,
>
> Truncated:
>
>>
>> You stated that if you need to not use any handleMarks then you most
>> likely don't want polls - and no polls is what a LEAF routine has to
>> guarantee:
>>
>> QUICK -> No handles -> no polls == LEAF
>
> I'll look at the other way around:
> QUICK can have polls therefore they cannot be leafs.
> (at least the one triggering this assert)
>
>>
>>> Since we missing the cleaner, accidentally using a HandleMark would
>>> lead to a leak. The NoHandleMark protected against this leak.
>>
>> Maybe I'm misunderstanding exactly how HandleMarks nest and behave. I
>> would have thought this nesting would be allowed:
>>
>> entry_point
>> NoHandleMark
>> -> subroutine
>> HandleMark // prevents leak of Handle to outer scope
>> allocate handle
>>
>> whereas this would cause an error
>>
>> entry_point
>> NoHandleMark
>> -> subroutine
>> allocate handle
>>
>> but IIUC a NoHandleMark prevents all and any handle use in its own
>> scope or a nest scope - no?
>
> Yes, sorry, NoHandleMark increments _no_handle_mark_nesting and
> HandleArea::allocate_handle checks that it is 0, otherwise this assert.
> (it also checks that _handle_mark_nesting is larger than 0, so it must
> be inside a HandleMark)
>
>>
>> I'm not sure that is viable, or the right way to try and address
>> this. In the extreme it would require all VM susbsystems to be fully
>> re-entrant and that is not a reasonable expectation.
>
> We already have that today with safepoint, many parts of subsystems
> can't handle
> safepoints. The one adding the new code to be run in a handshake must
> make sure
> that works. Not saying we should be able to run anything in a
> handshake, but
> fundamental things like Handles should be allowed.
I'm going to have to disagree with the comparison here. I don't think
comparing handshakes with blocking for safepoints is quite right. A
thread blocking for a safepoint while executing a subsystem's code is
a synchronous thing in my mind:
I'm calling into the subsystem and that subsystem uses locks so my
thread might safepoint while in there...
The subsystem has to synchronously prepare itself for grabbing that
lock by Handle-izing oops, etc...
When I think about handshakes, I think about them as happening
asynchronously
like async-signals resulting in calls to handlers... Maybe my mental
model of
handshakes is wrong... :-)
In any case, I'm going to hold off on reviewing the code since I think
you're still considering making changes based on David's last set of
comments...
Dan
>
>>
>>> This changes the polling model a bit and we have not proper look at
>>> this.
>>> Maybe we should add the constraints to the poll and to find any
>>> potential
>>> troublesome polls.
>>
>> I'm not sure how we would discover the problems until we have a
>> handshake that executes some code that violates a constraint. The
>> constraints themselves are not obvious. Subsystems do not clearly
>> identify themselves as being reentrant or not - most things are not
>> reentrant by their nature.
>
> As we do with safepoints, NoSafepointVerifier (since it covers both
> cases).
>
> /Robbin
>
>>
>> Cheers,
>> David
>>
>>> Thanks, Robbin
>>>
>>>>
>>>> Thanks,
>>>> David
>>>> -----
>>>>
>>>>>
>>>>> Thanks, Robbin
>>>>>
>>>>> Some extra words about NoHandleMark:
>>>>> I believe NoHandleMark should be removed.
>>>>> In the LEAF case, there is no point in creating a Handle within a
>>>>> NoSafepointVerifier, since we don't safepoint.
>>>>> The other usecase seems to be, I'm in java don't do VM things, and
>>>>> someone tried
>>>>> to protected that with a NoHandleMark. There many ways to create a
>>>>> much more
>>>>> robust check for that.
>>>>> But a discussion for another time.
>>>>>
>>>>>
>>>>>>
>>>>>> Thanks,
>>>>>> David
>>>>>>
>>>>>>> Issue:
>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8228758
>>>>>>>
>>>>>>> Changeset:
>>>>>>> http://cr.openjdk.java.net/~rehn/8228758/webrev/
>>>>>>>
>>>>>>> Passes t1-3 (and performance benchmarks)
>>>>>>>
>>>>>>> Thanks, Robbin
More information about the hotspot-runtime-dev
mailing list