RFR (M): 8165857: CMS _overflow_list is missing volatile qualifiers
Kim Barrett
kim.barrett at oracle.com
Tue Sep 20 18:25:51 UTC 2016
> On Sep 20, 2016, at 8:57 AM, Erik Österlund <erik.osterlund at oracle.com> wrote:
>
> Hi Kim,
>
> On 2016-09-19 23:28, Kim Barrett wrote:
>>> On Sep 19, 2016, at 7:43 AM, Erik Österlund <erik.osterlund at oracle.com> wrote:
>>>
>>> Hi,
>>>
>>> This bug is a split out of the larger JDK-8033552 for adding volatile qualifiers to lock-free code.
>>> The motivation is to make our implementation more robust since these kind of issues have struck us a few times too many already.
>>>
>>> CR: https://bugs.openjdk.java.net/browse/JDK-8165857
>>> Webrev: http://cr.openjdk.java.net/~eosterlund/8165857/webrev.00/
>>>
>>> This specific CR handles the lack of volatile qualifiers for the _overflow_list fields of the ParallelGC ConcurrentMarkSweepGeneration and ParNewGeneration classes.
>>> The type of the overflow list has been changed to HeapWord *volatile per Kim's recommendation as an oop variant requires changes to the oop class with new overloads, which seems a bit unnecessary considering the overflow lists are hardly proper oop lists either; it has e.g. sentinel values.
>>>
>>> I went ahead and did the required changes to make the lists HeapWord *volatile, which should make them a little bit more robust.
>>>
>>> Testing: JPRT
>>>
>>> I will need a sponsor to push this.
>>>
>>> Thanks,
>>> /Erik
>> There are a lot more casts than I expected.
>>
>> After talking to Coleen, I think a better solution is to declare these
>> lists to be "oopDesc* volatile" (rather than my previous suggestion of
>> "HeapWord* volatile" that was used in webrev.00).
>>
>> That still dodges the need for additional overloads on the oop class
>> when CHECK_UNHANDLED_OOPS is true that one gets if the lists are
>> "volatile oop". It also removes the need for all the casts to deal
>> with oop/oopDesc* <-> HeapWord*. There will still be casts needed for
>> the cmpxchg_ptr results, but those are needed anyway.
>
> Thank you for the review.
>
> Yes you are right. It worked fine with just oopDesc* volatile, and that did spread considerably less. Here is a new patch with just that:
> http://cr.openjdk.java.net/~eosterlund/8165857/webrev.02/
Why the change to ParNewGeneration::overflow_list() ?
Implicit conversion should handle that.
>> Because of implicit conversions, I think just the "oopDesc* volatile"
>> change to the list heads might build and run without any further
>> changes. However, it might be desirable to change the list
>> manipulations to explicitly use oopDesc* rather than oop. Or maybe
>> even consider introducing a new typedef for oopDesc* for each of these
>> cases?
>>
>
> Yes, perhaps. If you prefer, I made a webrev with the explicit casts. Here is a new patch with that included:
> http://cr.openjdk.java.net/~eosterlund/8165857/webrev.03/
> ...and incremental from the one with implicit casts above:
> http://cr.openjdk.java.net/~eosterlund/8165857/webrev.02_03/
That's not what I had in mind. Rather, I was suggesting changing
locals like observed_overflow_list &etc to be "oopDesc*" rather than
"oop", so there are no conversions (implicit or explicit).
I have a mild preference for explicit oopDesc* rather than implicit
oop conversions here. I wonder what other reviewers might have to
say.
More information about the hotspot-gc-dev
mailing list