RFR: 8166811: Missing memory fences between memory allocation and refinement
Kim Barrett
kim.barrett at oracle.com
Thu Nov 17 21:20:35 UTC 2016
> On Nov 17, 2016, at 12:07 PM, Thomas Schatzl <thomas.schatzl at oracle.com> wrote:
>
> Hi Kim,
>
>
>
> On Thu, 2016-11-17 at 12:28 +0100, Thomas Schatzl wrote:
>> Hi Kim,
>>
>>
> [...]
>
>> So the check in g1RemSet.cpp
>>
>> 597 if (!r->is_old_or_humongous()) {
>>
>> may filter the card out wrongly when processing the card from thread
>> B
>> as far as I can see.
>>
>> That's why I remarked about only being able to filter out using
>> is_young() here. For the refinement thread, "top" is current (after
>> the
>> fence), but the region type not (may still be "Free" until the
>> refinement "synchronizes" with thread A in some way), doesn't it?
>>
>> The change to "top" must have been observed already after the fence
>> (in
>> line 684) though and is safe to use (the allocation of the TLAB for
>> thread B sets top using appropriate barriers, and the refinement will
>> synchronize with whatever thread B set).
>>
>> Probably I am overlooking something about how the type of region X
>> set by thread A can be visible to refinement if it only
>> "synchronizes" with thread B (that did not write the type of region
>> X).
>
> I think it is good. Erik gave me the hint (and probably you already
> mentioned it somewhere). That case can only happen for young regions,
> and we can ignore them.
>
> We only allocate into humongous regions once.
>
> Thanks,
> Thomas
Kudos to Erik of helping you answer your question. I was still struggling
with understanding the scenario you were trying to describe.
More information about the hotspot-dev
mailing list