8235982: AArch64: Insufficient memory barriers in shadow region algorithm

The memory barriers used for synchronizing ParallelCompactData::RegionData::_shadow_state and ParallelCompactData::RegionData::shadow_region are insufficient to prevent reordering of loads.

Reviewed-by: tschatzl, sjohanss
This commit is contained in:
Nick Gasson 2019-12-18 11:20:13 +01:00
parent 079db54d51
commit 995fbebd81

View File

@ -630,25 +630,25 @@ inline bool ParallelCompactData::RegionData::claim()
}
inline bool ParallelCompactData::RegionData::mark_normal() {
return Atomic::cmpxchg(&_shadow_state, UnusedRegion, NormalRegion, memory_order_relaxed) == UnusedRegion;
return Atomic::cmpxchg(&_shadow_state, UnusedRegion, NormalRegion) == UnusedRegion;
}
inline bool ParallelCompactData::RegionData::mark_shadow() {
if (_shadow_state != UnusedRegion) return false;
return Atomic::cmpxchg(&_shadow_state, UnusedRegion, ShadowRegion, memory_order_relaxed) == UnusedRegion;
return Atomic::cmpxchg(&_shadow_state, UnusedRegion, ShadowRegion) == UnusedRegion;
}
inline void ParallelCompactData::RegionData::mark_filled() {
int old = Atomic::cmpxchg(&_shadow_state, ShadowRegion, FilledShadow, memory_order_relaxed);
int old = Atomic::cmpxchg(&_shadow_state, ShadowRegion, FilledShadow);
assert(old == ShadowRegion, "Fail to mark the region as filled");
}
inline bool ParallelCompactData::RegionData::mark_copied() {
return Atomic::cmpxchg(&_shadow_state, FilledShadow, CopiedShadow, memory_order_relaxed) == FilledShadow;
return Atomic::cmpxchg(&_shadow_state, FilledShadow, CopiedShadow) == FilledShadow;
}
void ParallelCompactData::RegionData::shadow_to_normal() {
int old = Atomic::cmpxchg(&_shadow_state, ShadowRegion, NormalRegion, memory_order_relaxed);
int old = Atomic::cmpxchg(&_shadow_state, ShadowRegion, NormalRegion);
assert(old == ShadowRegion, "Fail to mark the region as finish");
}