From 1bd0ce1f51760d2e57e94b19b83d3ee0fa4aebcd Mon Sep 17 00:00:00 2001 From: William Kemper Date: Thu, 27 Mar 2025 16:34:19 +0000 Subject: [PATCH] 8352918: Shenandoah: Verifier does not deactivate barriers as intended Reviewed-by: kdnilsen, shade, ysr --- .../share/gc/shenandoah/shenandoahRootVerifier.cpp | 12 +++++++++--- .../share/gc/shenandoah/shenandoahRootVerifier.hpp | 3 ++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.cpp b/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.cpp index 3fbf3e8d6d5..4c7ae68fdbe 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.cpp @@ -46,13 +46,19 @@ ShenandoahGCStateResetter::ShenandoahGCStateResetter() : _heap(ShenandoahHeap::heap()), - _gc_state(_heap->gc_state()) { + _saved_gc_state(_heap->gc_state()), + _saved_gc_state_changed(_heap->_gc_state_changed) { + // Clear state to deactivate barriers. Indicate that state has changed + // so that verifier threads will use this value, rather than thread local + // values (which we are _not_ changing here). _heap->_gc_state.clear(); + _heap->_gc_state_changed = true; } ShenandoahGCStateResetter::~ShenandoahGCStateResetter() { - _heap->_gc_state.set(_gc_state); - assert(_heap->gc_state() == _gc_state, "Should be restored"); + _heap->_gc_state.set(_saved_gc_state); + _heap->_gc_state_changed = _saved_gc_state_changed; + assert(_heap->gc_state() == _saved_gc_state, "Should be restored"); } void ShenandoahRootVerifier::roots_do(OopIterateClosure* oops) { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.hpp b/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.hpp index da7ca864dbb..405c69c4160 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.hpp @@ -32,7 +32,8 @@ class ShenandoahGCStateResetter : public StackObj { private: ShenandoahHeap* const _heap; - const char _gc_state; + const char _saved_gc_state; + const bool _saved_gc_state_changed; public: ShenandoahGCStateResetter();