[jdk16] RFR: 8259271: gc/parallel/TestDynShrinkHeap.java still fails "assert(covered_region.contains(new_memregion)) failed: new region is not in covered_region"

Kim Barrett kbarrett at openjdk.java.net
Thu Jan 21 15:40:40 UTC 2021


On Thu, 21 Jan 2021 10:45:52 GMT, Thomas Schatzl <tschatzl at openjdk.org> wrote:

>> Please review this fix for an intermittent crash when using ParallelGC on
>> aarch64.  The problem is a mis-ordered pair of reads that permit an
>> algorithmic invariant to be violated.  The mis-ordering is due to the lack
>> any explicit ordering request (a missing barrier).
>> 
>> In MutableSpace::cas_allocate, we had
>> 
>>     HeapWord* obj = top();
>>     if (pointer_delta(end(), obj) >= size) {
>>       ... space available, attempt the CAS to claim it ...
>>     }
>> 
>> If end is read before top, other threads may advance top and end between
>> those reads.  If, when top is read, current top > old end and current top +
>> size > current end, the range check will unexpectedly pass because of
>> underflow in pointer_delta.  This will allow top to be advanced to a value
>> which is > current end, violating the algorithmic invariant, and likely
>> leading to crashes or memory corruption.
>> 
>> gcc for x86 doesn't reorder the reads, but for aarch64 it does, and is
>> permitted to do so.  Even if it didn't, there is nothing to prevent the
>> hardware from doing so.  The solution is to use a load_acquire for top, to
>> ensure the needed order.
>> 
>> This may have been the actual root cause of JDK-8257999.  However, the
>> change made there was and still is needed for the reasons described.
>> 
>> Testing:
>> mach5 tier1-3
>> 
>> Even with knowledge of the failure mode it's very hard to reproduce.  I was
>> unable to catch the underflow case in over 1K attempts using machines in our
>> test farm, though StefanK caught it a few times on a personal machine.
>
> Marked as reviewed by tschatzl (Reviewer).

Thanks @tschatzl , @walulyai , and @fisk for reviews.

-------------

PR: https://git.openjdk.java.net/jdk16/pull/127



More information about the hotspot-gc-dev mailing list