From 636b56374e4617ebd28c69ccac71fbf29dfd648e Mon Sep 17 00:00:00 2001 From: William Kemper Date: Mon, 23 Jun 2025 21:03:04 +0000 Subject: [PATCH] 8357550: GenShen crashes during freeze: assert(!chunk->requires_barriers()) failed Reviewed-by: shade Backport-of: 17cf49746d0c289bdf779c974cdc84a3ab32ab4b --- .../shenandoah/shenandoahGenerationalHeap.cpp | 23 +++++++++++++++++++ .../shenandoah/shenandoahGenerationalHeap.hpp | 2 ++ 2 files changed, 25 insertions(+) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp index 1f84feb20e8..731868310f4 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp @@ -183,6 +183,29 @@ void ShenandoahGenerationalHeap::stop() { regulator_thread()->stop(); } +bool ShenandoahGenerationalHeap::requires_barriers(stackChunkOop obj) const { + if (is_idle()) { + return false; + } + + if (is_concurrent_young_mark_in_progress() && is_in_young(obj) && !marking_context()->allocated_after_mark_start(obj)) { + // We are marking young, this object is in young, and it is below the TAMS + return true; + } + + if (is_in_old(obj)) { + // Card marking barriers are required for objects in the old generation + return true; + } + + if (has_forwarded_objects()) { + // Object may have pointers that need to be updated + return true; + } + + return false; +} + void ShenandoahGenerationalHeap::evacuate_collection_set(bool concurrent) { ShenandoahRegionIterator regions; ShenandoahGenerationalEvacuationTask task(this, ®ions, concurrent, false /* only promote regions */); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp index cef5dfd7070..ed5a6f3d9a5 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp @@ -128,6 +128,8 @@ public: void stop() override; + bool requires_barriers(stackChunkOop obj) const override; + // Used for logging the result of a region transfer outside the heap lock struct TransferResult { bool success;