From c8d4c7d1815fe44cecaceeec497ecb758aabebf7 Mon Sep 17 00:00:00 2001 From: Thomas Schatzl Date: Tue, 7 Jul 2026 12:53:43 +0000 Subject: [PATCH] 8387760: G1: Let G1ConcurrentMark::_chunks_in_chunk_list use the Atomic API Reviewed-by: shade, aboldtch --- src/hotspot/share/gc/g1/g1ConcurrentMark.cpp | 6 +++--- src/hotspot/share/gc/g1/g1ConcurrentMark.hpp | 6 +++--- src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp b/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp index 6f9e4e2e9cf..233901c30f8 100644 --- a/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp +++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.cpp @@ -299,7 +299,7 @@ void G1CMMarkStack::add_chunk_to_list(Atomic* list, TaskQu void G1CMMarkStack::add_chunk_to_chunk_list(TaskQueueEntryChunk* elem) { MutexLocker x(G1MarkStackChunkList_lock, Mutex::_no_safepoint_check_flag); add_chunk_to_list(&_chunk_list, elem); - _chunks_in_chunk_list++; + _chunks_in_chunk_list.add_then_fetch(1u, memory_order_relaxed); } void G1CMMarkStack::add_chunk_to_free_list(TaskQueueEntryChunk* elem) { @@ -319,7 +319,7 @@ G1CMMarkStack::TaskQueueEntryChunk* G1CMMarkStack::remove_chunk_from_chunk_list( MutexLocker x(G1MarkStackChunkList_lock, Mutex::_no_safepoint_check_flag); TaskQueueEntryChunk* result = remove_chunk_from_list(&_chunk_list); if (result != nullptr) { - _chunks_in_chunk_list--; + _chunks_in_chunk_list.sub_then_fetch(1u, memory_order_relaxed); } return result; } @@ -363,7 +363,7 @@ bool G1CMMarkStack::par_pop_chunk(G1TaskQueueEntry* ptr_arr) { } void G1CMMarkStack::set_empty() { - _chunks_in_chunk_list = 0; + _chunks_in_chunk_list.store_relaxed(0); _chunk_list.store_relaxed(nullptr); _free_list.store_relaxed(nullptr); _chunk_allocator.reset(); diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp b/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp index 73dabc12863..f1f84bf246e 100644 --- a/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp +++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.hpp @@ -213,8 +213,8 @@ private: Atomic _free_list; // Linked list of free chunks that can be allocated by users. char _pad1[DEFAULT_PADDING_SIZE - sizeof(TaskQueueEntryChunk*)]; Atomic _chunk_list; // List of chunks currently containing data. - volatile size_t _chunks_in_chunk_list; - char _pad2[DEFAULT_PADDING_SIZE - sizeof(TaskQueueEntryChunk*) - sizeof(size_t)]; + Atomic _chunks_in_chunk_list; + char _pad2[DEFAULT_PADDING_SIZE - sizeof(TaskQueueEntryChunk*) - sizeof(_chunks_in_chunk_list)]; // Atomically add the given chunk to the list. void add_chunk_to_list(Atomic* list, TaskQueueEntryChunk* elem); @@ -265,7 +265,7 @@ private: // Return the approximate number of oops on this mark stack. Racy due to // unsynchronized access to _chunks_in_chunk_list. - size_t size() const { return _chunks_in_chunk_list * EntriesPerChunk; } + size_t size() const { return _chunks_in_chunk_list.load_relaxed() * EntriesPerChunk; } void set_empty(); diff --git a/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp b/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp index ec6a486dc02..76fdcd218ae 100644 --- a/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp +++ b/src/hotspot/share/gc/g1/g1ConcurrentMark.inline.hpp @@ -93,7 +93,7 @@ inline void G1CMMarkStack::iterate(Fn fn) const { TaskQueueEntryChunk* cur = _chunk_list.load_relaxed(); while (cur != nullptr) { - guarantee(num_chunks <= _chunks_in_chunk_list, "Found %zu oop chunks which is more than there should be", num_chunks); + guarantee(num_chunks <= _chunks_in_chunk_list.load_relaxed(), "Found %zu oop chunks which is more than there should be", num_chunks); for (size_t i = 0; i < EntriesPerChunk; ++i) { if (cur->data[i].is_null()) {