RFR (S) 5103339: Strengthen NoSafepointVerifier
Robbin Ehn
robbin.ehn at oracle.com
Wed Aug 7 11:26:15 UTC 2019
Hi Coleen,
On 8/6/19 10:38 PM, coleen.phillimore at oracle.com wrote:
>
> Hi Robbin,
>
> On 8/6/19 3:45 AM, Robbin Ehn wrote:
>> Hi Coleen,
>>
>> On 2019-08-05 18:00, coleen.phillimore at oracle.com wrote:
>>> Summary: Add NSV check at possible safepoint transition or places that could
>>> take out locks. Consolidate with clearing unhandled oops.
>>
>> I would like us to instead poison the poll check it's self.
>> So any polls between A and B will just assert directly.
>> It doesn't matter if there is actually a safepoint or not, the poll is not
>> allowed. check_for_valid_safepoint_state is also only checked for safepoint,
>> not handshakes. Handshakes should not be allowed either.
>>
>> E.g.
>> bool SafepointMechanism::local_poll_armed(JavaThread* thread) {
>> assert(thread->poll_allowed(), "Hit poll site");
>>
>> What you think?
>
> When I started working on this, this was my intention. But I looked at the
> callers of local_poll_armed, which are SafepointMechanism::should_block() and
> SafepointMechanism::block_if_requested() and there was already a more extensive
> safepoint check in all the higher level callers. For example, in memory
> allocation, the safepoint check is in check_for_valid_safepoint_state, which
> checks that the caller has no NoSafepointVerifier even if the allocation doesn't
> result in a safepoint poll. Also some selected 'else' clauses should be checked
> for safepoints allowed, and more could be added when we run into them. The
> missing 'else' clause checks were what we found were missed with the clear
> unhandled oops code.
>
> So the only place that was missing was a transition from or *back* to
> thread_in_vm, which needs to clear the unhanded oops and check for
> NoSafepointVerifier. The other transitions don't make sense to check because
> the NoSafepointVerifier is in vm code. That's why it was added there.
>
> For now, the handshake code goes through a VMOperation, which has a
> check_for_valid_safepoint_state() so it does get checked for NSV.
>
> I wrote up a complete list of places where should_block and block_if_requested
> are called and why where NSV checking from my change is better. I'll send it to
> you.
>
> I'm attracted to the simplicity of this idea but I don't think it's something we
> want to check more than once and it will miss places we do want to check.
>
Ok, thanks for looking into it!
/Robbin
> Thanks,
> Coleen
>
>
>>
>> /Robbin
>>
>>>
>>> This change checks for NoSafepointVerifier no_safepoint_counts at possible
>>> safepoints. The starting set is at transitions, and in the "else" clauses
>>> where CHECK_UNHANDLED_OOPS were clearing unhandled oops. Some of these were
>>> removed because they weren't places with possible safepoints, so were wrong.
>>>
>>> The unhandled oops clearing and no_safepoint counter check are now done in
>>> the same function. MemAllocator -> check_for_valid_allocation_state calls
>>> check_for_valid_safepoint_state which calls check_possible_safepoint.
>>>
>>> Calls to check_possible_safepoint are in DEBUG_ONLY when Thread::current() is
>>> called.
>>>
>>> I had to remove it from the else clause in JvmtiThreadState because it's
>>> called from a place that cannot safepoint (see vtableStubs.cpp).
>>>
>>> os.cpp ResourceMark needed for debugging.
>>>
>>> Tested with tier1 on all Oracle platforms, and tier 1-3 on linux-x64-debug.
>>>
>>> open webrev at http://cr.openjdk.java.net/~coleenp/2019/5103339.01/webrev
>>> bug link https://bugs.openjdk.java.net/browse/JDK-5103339
>>>
>>> Thanks,
>>> Coleen
>
More information about the hotspot-runtime-dev
mailing list