RFR 8242484: Rework thread deletion during VM termination
coleen.phillimore at oracle.com
coleen.phillimore at oracle.com
Mon Apr 20 13:51:33 UTC 2020
On 4/20/20 9:32 AM, coleen.phillimore at oracle.com wrote:
>
>
> On 4/18/20 9:53 AM, David Holmes wrote:
>> Hi Coleen,
>>
>> On 18/04/2020 4:24 am, coleen.phillimore at oracle.com wrote:
>>> On 4/17/20 1:27 PM, Patricio Chilano wrote:
>>>> Hi Coleen,
>>>>
>>>> Thanks for looking at this.
>>>>
>>>> On 4/17/20 12:57 PM, coleen.phillimore at oracle.com wrote:
>>>>>
>>>>> This looks good to me also, although I'd like a reprisal of the
>>>>> comment before the delete thread line that says something ilke:
>>>>>
>>>>> // We are here after VM_Exit::set_vm_exited() so we can't call
>>>>> // thread->smr_delete() or we will block on the Threads_lock.
>>>> Ok, I added back the original comment:
>>>>
>>>> diff --git a/src/hotspot/share/runtime/thread.cpp
>>>> b/src/hotspot/share/runtime/thread.cpp
>>>> --- a/src/hotspot/share/runtime/thread.cpp
>>>> +++ b/src/hotspot/share/runtime/thread.cpp
>>>> @@ -4472,6 +4472,11 @@
>>>> // exit_globals() will delete tty
>>>> exit_globals();
>>>>
>>>> + // We are here after VM_Exit::set_vm_exited() so we can't call
>>>> + // thread->smr_delete() or we will block on the Threads_lock.
>>>> + // Deleting the shutdown thread here is safe because another
>>>> + // JavaThread cannot have an active ThreadsListHandle for
>>>> + // this JavaThread.
>>>> delete thread;
>>
>> Putting the comment back exactly as-was doesn't fit in well given the
>> new code we have introduced. If we want to explain this in detail
>> then it should be IMO when we first hit the code that interacts with
>> ThreadSMR:
>>
>> // We are no longer on the main thread list but could still be in a
>> // secondary list where another thread may try to interact with us.
>> // So wait until all such interactions are complete before we bring
>> ! // the VM to the termination safepoint. Normally this would be done
>> + // using thread->smr_delete() below where we delete the thread, but
>> + // we can't call that after the termination safepoint is active as we
>> + // will deadlock on the Threads_lock. Once all interactions are
>> + // complete it is safe to directly delete the thread at any time.
>> ThreadsSMRSupport::wait_until_not_protected(thread);
>
> I disagree. I think someone will find the 'delete thread' and not
> know why it's there alone without smr_delete(), and might not see this
> big comment or realize how it applies to delete. I think the 'delete
> thread' shouldn't be alone.
Or even like:
// Thread must call wait_until_not_protected() before termination
safepoint first. See above.
delete thread;
If you want to move the comment above.
Coleen
>
> Coleen
>
>
>>
>> Thanks,
>> David
>> -----
>>
>>>>
>>>>> But why would it block? ... I don't see what thread has the
>>>>> Threads_lock. Is this comment (that I want put back) accurate?
>>>> It will block because the VMThread owns the Threads_lock. The
>>>> VMThread will start the terminating safepoint and exit but will
>>>> never release the lock.
>>>
>>> Thanks for the explanation. In this code, when we call
>>> VMThread::wait_for_vm_thread_exit, that sets the _should_terminate
>>> flag, wakes up the VMThread and the VMThread will grab the
>>> Threads_lock for the final safepoint. Therefore below at "delete
>>> thread" we can't grab the Threads_lock.
>>>
>>> Comment looks good.
>>> Thanks,
>>> Coleen
>>>>
>>>> Patricio
>>>>> thanks,
>>>>> Coleen
>>>>>
>>>>> On 4/17/20 11:09 AM, Robbin Ehn wrote:
>>>>>> Hi Patricio, looks good, thanks.
>>>>>>
>>>>>> /Robbin
>>>>>>
>>>>>> On 2020-04-14 22:07, Patricio Chilano wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> Please review this small follow up for 8240918 to always delete
>>>>>>> the JavaThread that calls Threads::destroy_vm().
>>>>>>> In 8240918 I added a conditional check in Threads::destroy_vm()
>>>>>>> to prevent deleting a JavaThread when there are handshakers
>>>>>>> blocked in its handshake_turn_sem semaphore. We can actually
>>>>>>> avoid this issue altogether if after removing the JavaThread
>>>>>>> from the active list and before triggering the terminating
>>>>>>> safepoint, we wait until the JavaThread is no longer protected
>>>>>>> by a ThreadsList reference.
>>>>>>>
>>>>>>> Tested in mach5 tiers 1-6.
>>>>>>>
>>>>>>> Bug:
>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8242484
>>>>>>>
>>>>>>> Webrev:
>>>>>>> http://cr.openjdk.java.net/~pchilanomate/8242484/v1/webrev/
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Patricio
>>>>>
>>>>
>>>
>
More information about the hotspot-runtime-dev
mailing list