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