# HG changeset patch # User rkennke # Date 1584442335 -3600 # Tue Mar 17 11:52:15 2020 +0100 # Node ID 4cb270cb0689914c305f9d1412874cd73c88f766 # Parent 42b62267498dbea03a82eeb073c6020b4b43d288 8241081: Shenandoah: Do not modify update-watermark concurrently diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp @@ -2393,7 +2393,6 @@ if (r->is_active() && !r->is_cset()) { _heap->marked_object_oop_iterate(r, &cl, update_watermark); } - r->set_update_watermark(r->bottom()); if (ShenandoahPacing) { _heap->pacer()->report_updaterefs(pointer_delta(update_watermark, r->bottom())); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.hpp @@ -261,7 +261,7 @@ volatile size_t _live_data; volatile size_t _critical_pins; - HeapWord* volatile _update_watermark; + HeapWord* _update_watermark; // Claim some space at the end to protect next region DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, 0); @@ -431,13 +431,19 @@ } HeapWord* get_update_watermark() const { + // Updates to the update-watermark only happen at safepoints or, when pushing + // back the watermark for evacuation regions, under the Shenandoah heap-lock. + // Consequently, we should access the field under the same lock. However, since + // those updates are only monotonically increasing, possibly reading a stale value + // is only conservative - we would not miss to update any fields. assert(bottom() <= _update_watermark && _update_watermark <= top(), "within bounds"); - return Atomic::load_acquire(&_update_watermark); + return _update_watermark; } void set_update_watermark(HeapWord* w) { + _heap->assert_heaplock_or_safepoint(); assert(bottom() <= w && w <= top(), "within bounds"); - Atomic::release_store(&_update_watermark, w); + _update_watermark = w; } private: