RFR:8047290:Ensure consistent safepoint checking in MutexLockerEx

Max Ockner max.ockner at oracle.com
Fri Nov 7 16:15:47 UTC 2014


Hello all,
I have made these additonal changes:
-Moved the assert() statements into the lock and lock_without_safepoint 
methods.
-Changed Monitor::SafepointAllowed to Monitor::SafepointCheckRequired
-Changed the Monitor::SafepointCheckRequired values for several locks 
which were locked outside of a MutexLockerEx (some were locked with 
MutexLocker, some were locked were locked without any MutexLocker* )

New webrev location: http://cr.openjdk.java.net/~coleenp/8047290/

Additional testing:
jtreg ./jdk/test/java/lang/invoke
jtreg jfr tests

Here is a list of ALL of the "sometimes" locks:

"WorkGroup monitor" share/vm/utilities/workgroup.cpp
"SLTMonitor" share/vm/gc_implementation/shared/concurrentGCThread.cpp
"CompactibleFreeListSpace._lock" 
share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp
"freelist par lock" 
share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp
"SR_lock" share/vm/runtime/thread.cpp

The remaining "sometimes" locks can be found in 
share/vm/runtime/mutexLocker.cpp:

ParGCRareEvent_lock
Safepoint_lock
Threads_lock
VMOperationQueue_lock
VMOperationRequest_lock
Terminator_lock
Heap_lock
Compile_lock
PeriodicTask_lock
JfrStacktrace_lock

I have not checked the validity of the "sometimes" locks, and I believe 
that this should be a different project.

Thanks for your help!
Max Ockner
On 10/15/2014 8:54 PM, David Holmes wrote:
> Hi Max,
>
> This is looking good.
>
> A few high-level initial comments:
>
> I think SafepointAllowed should be SafepointCheckNeeded
>
> Why are the checks in MutexLocker when the state is maintained in the 
> mutex itself and the mutex/monitor has lock_without_safepoint, and 
> wait(<safepoint checking flag>) ? I would have expected to see the 
> check in the mutex/monitor methods.
>
> Checking consistent usage of the _no_safepoint_check_flag is good. But 
> another part of this is that a monitor/mutex that never checks for 
> safepoints should never be held when a thread blocks at a safepoint - 
> is there some way to easily check that? I was surprised how many locks 
> are actually not checking for safepoints.
>
> Did you find any cases where the mutex/monitor was being used 
> inconsistently and incorrectly?
>
> Did you analyse the "sometimes" cases to see if they were safe? 
> (Aside: just for fun check out what happens if you lock the 
> Threads_lock with a safepoint check and a safepoint has been requested 
> :) ).
>
> Cheers,
> David
>
> On 16/10/2014 4:04 AM, Max Ockner wrote:
>> Hi all,
>>
>> I am a new member of the Hotspot runtime team in Burlington, MA.
>> Please review my first fix related to safepoint checking.
>>
>> Summary: MutexLockerEx can either acquire a lock with or without a
>> safepoint check.
>> In some cases, a particular lock must either safepoint check always or
>> never to avoid deadlocking.
>> Some other locks have semantics which allow them to avoid deadlocks
>> despite having a safepoint check only some of the time.
>> All locks that are OK having inconsistent safepoint checks have been
>> marked. All locks that should never safepoint check and all locks that
>> should always safepoint check have also been marked.
>> When a MutexLockerEx acquires a lock with or without a safepoint check,
>> the lock's safepointAllowed marker is checked to ensure consistent
>> safepoint checking.
>>
>> Webrev: http://oklahoma.us.oracle.com/~mockner/webrev/8047290/
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8047290
>>
>> Tested with:
>>      jprt "-testset hotspot"
>>      jtreg hotspot
>>      vm.quick.testlist
>>
>> Whitebox tests:
>> test/runtime/Safepoint/AssertSafepointCheckConsistency1.java: Test
>> expects Assert ("This lock should always have a safepoint check")
>> test/runtime/Safepoint/AssertSafepointCheckConsistency2.java: Test
>> expects Assert ("This lock should never have a safepoint check")
>> test/runtime/Safepoint/AssertSafepointCheckConsistency3.java: code
>> should not assert. (Lock is properly acquired with no safepoint check)
>> test/runtime/Safepoint/AssertSafepointCheckConsistency4.java: code
>> should not assert. (Lock is properly acquired with safepoint check)
>>
>> Thanks,
>> Max
>>



More information about the hotspot-dev mailing list