RFR 8232733: Remove need to grab Threads_lock while processing handshakes
Patricio Chilano
patricio.chilano.mateo at oracle.com
Tue Dec 10 18:49:14 UTC 2019
Hi Dan,
On 12/10/19 12:29 PM, Daniel D. Daugherty wrote:
> On 12/6/19 2:40 PM, Patricio Chilano wrote:
>> Hi all,
>>
>> Please review the following patch that removes the requirement of
>> having to acquire the Threads_lock while processing handshakes. The
>> guarantee that the JavaThread being handshaked will not exit and its
>> memory be freed is already provided by using SMR ThreadsLists. With
>> respect to the comments that the Threads_lock is needed to avoid a
>> suspended JavaThread from being resumed, that will not be a problem
>> since the JavaThread will still make the proper transition after
>> being resumed and will block if needed for the handshake.
>>
>> Tested with mach5, tiers1-7.
>
> Robbin has some handshake tests that stress suspend and thread exit
> paths:
>
> test/hotspot/jtreg/runtime/handshake/HandshakeSuspendExitTest.java
> test/hotspot/jtreg/runtime/handshake/HandshakeWalkExitTest.java
> test/hotspot/jtreg/runtime/handshake/HandshakeWalkOneExitTest.java
>
> I think running these in a loop for thousands of iterations would
> be a good idea.
Sure, I'll do that.
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8232733
>> Webrev: http://cr.openjdk.java.net/~pchilanomate/8232733/v01/webrev/
>
> src/hotspot/share/runtime/handshake.hpp
> No comments.
>
> src/hotspot/share/runtime/handshake.cpp
> old L151: // We need to re-think this with SMR ThreadsList.
> old L152: // There is an assumption in the code that the
> Threads_lock should be
> old L153: // locked during certain phases.
> This comment came from the Thread-SMR project (8167108). First
> appearance was in this webrev which came from the 2017.11.15
> rebase of the project done by Robbin:
>
> http://cr.openjdk.java.net/~dcubed/8167108-webrev/jdk10-08-delta/src/hotspot/share/runtime/handshake.cpp.frames.html
>
>
> I tracked it back a little further to Robbin's original webrev
> that I used to update the Thread-SMR project repo:
>
> http://rehn-ws.se.oracle.com/share/for_dan/smr-tlh-merge/full/webrev/src/hotspot/share/runtime/handshake.cpp.frames.html
>
>
> I checked my email archive and I can't find any discussion
> about the comment other than fixing some wording in it.
>
> old L206: // We need to re-think this with SMR ThreadsList.
> old L207: // There is an assumption in the code that the
> Threads_lock should
> old L208: // be locked during certain phases.
> Same analysis as above.
>
> Now let's look at the Threads_lock grabs:
>
> old L135: ThreadsListHandle tlh;
> old L155: MutexLocker ml(Threads_lock);
> old L156: by_vm_thread =
> _target->handshake_try_process_by_vmThread();
> Since the VMThread is executing this VMop not at a safepoint,
> prior to Thread-SMR we had to worry about a JavaThread exiting
> while the VMThread was checking to see if it could process the
> handshake on behalf of the JavaThread.
>
> With the ThreadsListHandle, all of the checks made in:
>
> _target->handshake_try_process_by_vmThread()
> HandshakeState::try_process_by_vmThread(JavaThread* target)
> possibly_vmthread_can_process_handshake(JavaThread* target)
>
> should be safe from a bad dereference without the Threads_lock.
> Yes, the JavaThread might exit, but the JavaThread data structure
> will hang around until all ThreadsListHandles that contain it are
> freed. So this code will be able to see the terminated state
> without risking a crash.
>
> We also had to worry about a suspended JavaThread being resumed
> and racing with the VMThread for processing the handshake
> request.
> With the Threads_lock being held, a target JavaThread could not
> be resumed so that potential race was also handled.
>
> It looks to me like the handshake code already handles a possible
> race between the VMThread and a JavaThread in handshake handling
> by claiming of the semaphore (via claim_handshake_for_vmthread).
> Only one thread can win that race...
>
> So the original worry must have actually been about a suspended
> JavaThread being seen as "safe" for the VMThread to handle its
> handshake only to have the JavaThread resumed and then run
> quickly
> to exit... In other words, I think the resume worry was a slight
> variation of the regular JavaThread exit worry. Again, with the
> ThreadsListHandle, I think that is no longer an issue.
>
> old L181: JavaThreadIteratorWithHandle jtiwh;
> old L209: jtiwh.rewind();
> old L210: MutexLocker ml(Threads_lock);
> old L214: if (thr->handshake_try_process_by_vmThread()) {
> Same analysis as for the previous Threads_lock grab:
>
> Again, with the JavaThreadIteratorWithHandle (which has a builtin
> ThreadsListHandle), I think that is no longer an issue.
Great, thanks for digging up the history behind the use of the Threads_lock!
> src/hotspot/share/runtime/mutexLocker.hpp
> No comments.
>
> src/hotspot/share/runtime/mutexLocker.cpp
> No comments.
>
> src/hotspot/share/runtime/safepoint.cpp
> No comments.
>
> src/hotspot/share/runtime/thread.hpp
> No comments.
>
> src/hotspot/share/runtime/thread.cpp
> No comments.
>
>
> Thumbs up!
>
> Thanks for removing these two Threads_lock uses.
Thanks for reviewing this Dan. I'll run those tests before pushing.
Patricio
> Dan
>
>
>>
>> Thanks,
>>
>> Patricio
>
More information about the hotspot-runtime-dev
mailing list