RFR: 8233061: ZGC: Enforce memory ordering in segmented bit maps
Stefan Karlsson
stefan.karlsson at oracle.com
Tue Nov 12 14:21:20 UTC 2019
Hi Erik,
This looks good and should be pushed.
Some comments for further cleanups in this area.
1) I think it would be nice to be explicit about the memory order used
in is_segment_live, instead of relying on the default value:
inline bool ZLiveMap::is_segment_live(BitMap::idx_t segment) const {
return segment_live_bits().par_at(segment);
}
inline bool ZLiveMap::set_segment_live_atomic(BitMap::idx_t segment) {
return segment_live_bits().par_set_bit(segment, memory_order_release);
}
This way it's more apparent that the writer intentionally chose
memory_order_acquire and didn't forget to specify the memory order to use.
2) I think would should be more explicit and use _bitmap.par_at(index,
memory_order_relaxed) here:
inline bool ZLiveMap::get(size_t index) const {
BitMap::idx_t segment = index_to_segment(index);
return is_marked() && // Page is marked
is_segment_live(segment) && // Segment is marked
_bitmap.at(index); // Object is marked
}
Thanks,
StefanK
On 2019-11-08 15:51, erik.osterlund at oracle.com wrote:
> Hi Per,
>
> Thanks for the review.
>
> /Erik
>
> On 11/8/19 2:38 PM, Per Liden wrote:
>>
>> On 10/28/19 4:53 PM, Erik Österlund wrote:
>>> Hi,
>>>
>>> In ZGC, bitmaps are lazily cleared in a segmented fashion. In this
>>> scheme, liveness is determined by looking at a counter, a segment bit
>>> map and finally the flat bit map structure. The accesses for the
>>> various stages need to be ordered properly. This patch sprinkles some
>>> OrderAccess calls to enforce this ordering.
>>>
>>> Out of curiosity, I disassembled libjvm.so with and without this
>>> patch to see if the reordering has bitten us in practice on x86_64.
>>> Fortunately, according to my analysis, it has not; we seem to have
>>> been lucky. But there is a lot of machine code, so I could have
>>> missed something. However, given that we now have an AArch64 port
>>> which is definitely affected by this problem, and compilers really
>>> are free to do whatever they want to in the future, it seems in order
>>> to enforce this explicitly.
>>>
>>> This patch depends on
>>> https://bugs.openjdk.java.net/browse/JDK-8233073 which exposes some
>>> memory ordering aware getters on BitMap. I did not want to just wrap
>>> the existing API in ZGC, so I split that out to a separate RFE.
>>>
>>> CR:
>>> http://cr.openjdk.java.net/~eosterlund/8233061/webrev.00/
>>
>> The rebased webrev.01 looks good.
>>
>> /Per
>>
>>>
>>> Bug:
>>> https://bugs.openjdk.java.net/browse/JDK-8233061
>>>
>>> Thanks,
>>> /Erik
>
More information about the hotspot-gc-dev
mailing list