RFR (S) 8049304: race between VM_Exit and _sync_FutileWakeups->inc()

David Holmes david.holmes at oracle.com
Tue Sep 1 06:13:50 UTC 2015


Hi Dan,

Hope you had that coffee :)

On 1/09/2015 8:51 AM, Daniel D. Daugherty wrote:
> Greetings,
>
> I've updated the "fix" for this bug based on code review comments
> received in round 0.
>
> JDK-8049304 race between VM_Exit and _sync_FutileWakeups->inc()
> https://bugs.openjdk.java.net/browse/JDK-8049304
>
> Webrev URL: http://cr.openjdk.java.net/~dcubed/8049304-webrev/1-jdk9-hs-rt/
>
> The easiest way to re-review is to download the two patch files
> and view them in your favorite file merge tool:
>
> http://cr.openjdk.java.net/~dcubed/8049304-webrev/0-jdk9-hs-rt/hotspot.patch
>
> http://cr.openjdk.java.net/~dcubed/8049304-webrev/1-jdk9-hs-rt/hotspot.patch
>
>
> Testing: Aurora Adhoc RT-SVC nightly batch (in process)
>           Aurora Adhoc vm.tmtools batch (in process)
>           Kim's repro sequence for JDK-8049304
>           Kim's repro sequence for JDK-8129978
>           JPRT -testset hotspot
>
> Changes between round 0 and round 1:
>
> - add an 'is_safe' parameter to the OM_PERFDATA_OP macro;

The sense of safepoint-safe is a bit confusing to me. If the thread is 
in a safepoint-safe-state then it seems safepoint-safe==false ??

>    safepoint-safe callers can access _has_PerfData flag directly;
>    non-safepoint-safe callers use a load-acquire to fetch the
>    current _has_PerfData flag value

load-acquire makes no difference to the "currentness" of _has_PerfData 
and has no affect on the size of the "race window". So I don't see any 
point to this is-safe distinction.

> - change PerfDataManager::destroy() to simply set _has_PerfData
>    to zero (field is volatile) and then use a fence() to prevent
>    any reordering of operations in any direction; it's only done
>    once during VM shutdown so...

See previous email :)

> - change perfMemory_exit() to only call PerfDataManager::destroy()
>    when called at a safepoint and when the StatSample is not
>    running; this means when the VM is aborting, we no longer have
>    a race between the original crash report and this code path.

Sounds reasonable.

I have few specific comments/nits:

src/share/vm/runtime/perfData.cpp

  43 volatile jint   PerfDataManager::_has_PerfData = false;

Nit: jint should be initialized with 0 not false.

  287   // manipulation before we free the memory. The two alternatives
  288   // are 1) leak the PerfData memory or 2) do some form of ordered
  289   // access before every PerfData operation.

No amount of ordered access will fix the race - only synchronization of 
some form.

  315 void PerfDataManager::add_item(PerfData* p, bool sampled) {
  316
  317   MutexLocker ml(PerfDataManager_lock);
  318
  319   if (_all == NULL) {
  320     _all = new PerfDataList(100);
  321     OrderAccess::release_store(&_has_PerfData, 1);
  322   }

I can't see any purpose for a release_store here. You have one-time 
initialization code guarded with a mutex. A release_store adds nothing 
here - other than future head-scratching from maintainers of this code.

Thanks,
David

> I believe that I've addressed all comments from round 0.
>
> Thanks, in advance, for any comments, questions or suggestions.
>
> Dan
>
>
> On 8/25/15 3:08 PM, Daniel D. Daugherty wrote:
>> Greetings,
>>
>> I have a "fix" for a long standing race between JVM shutdown and the
>> JVM statistics subsystem:
>>
>> JDK-8049304 race between VM_Exit and _sync_FutileWakeups->inc()
>> https://bugs.openjdk.java.net/browse/JDK-8049304
>>
>> Webrev URL:
>> http://cr.openjdk.java.net/~dcubed/8049304-webrev/0-jdk9-hs-rt/
>>
>> Testing: Aurora Adhoc RT-SVC nightly batch
>>          Aurora Adhoc vm.tmtools batch
>>          Kim's repro sequence for JDK-8049304
>>          Kim's repro sequence for JDK-8129978
>>          JPRT -testset hotspot
>>
>> This "fix":
>>
>> - adds a volatile flag to record whether PerfDataManager is holding
>>   data (PerfData objects)
>> - adds PerfDataManager::has_PerfData() to return the flag
>> - changes the Java monitor subsystem's use of PerfData to
>>   check both allocation of the monitor subsystem specific
>>   PerfData object and the new PerfDataManager::has_PerfData()
>>   return value
>>
>> If the global 'UsePerfData' option is false, the system works as
>> it did before. If 'UsePerfData' is true (the default on non-embedded
>> systems), the Java monitor subsystem will allocate a number of
>> PerfData objects to record information. The objects will record
>> information about Java monitor subsystem until the JVM shuts down.
>>
>> When the JVM starts to shutdown, the new PerfDataManager flag will
>> change to false and the Java monitor subsystem will stop using the
>> PerfData objects. This is the new behavior. As noted in the comments
>> I added to the code, the race is still present; I'm just changing
>> the order and the timing to reduce the likelihood of the crash.
>>
>> Thanks, in advance, for any comments, questions or suggestions.
>>
>> Dan
>>
>>
>>
>


More information about the hotspot-runtime-dev mailing list