RFR: JDK-8307314: Implementation: Generational Shenandoah (Experimental) [v5]

Kelvin Nilsen kdnilsen at openjdk.org
Mon Jun 5 13:06:25 UTC 2023


On Mon, 5 Jun 2023 12:46:58 GMT, Kelvin Nilsen <kdnilsen at openjdk.org> wrote:

>> Kelvin Nilsen has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   Remove three asserts making comparisons between atomic volatile variables
>>   
>>   Though changes to the volatile variables are individually protected by
>>   Atomic load and store operations, these asserts were not assuring
>>   atomic access to multiple volatile variables, each of which could be
>>   modified independently of the others.  The asserts were therefore not
>>   trustworthy, as has been confirmed by more extensive testing.
>
> src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp line 660:
> 
>> 658: void ShenandoahGeneration::increase_used(size_t bytes) {
>> 659:   Atomic::add(&_used, bytes);
>> 660: }
> 
> Note that C++ subexpression evaluation order is undefined.  Here is an example of what can go wrong with the removed assertion:
> 
> ThisThread:  fetches _affiliated_region_count * begins to multiply with region_size
> OtherThread: increases _used and increases _affiliated_region_count appropriately (for a large allocation)
> ThisThread: fetches _used and observes assert violation

We have seen this race manifest in actual testing, which is what has motivated us to remove the assertions.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/14185#discussion_r1218045035


More information about the hotspot-dev mailing list