From ac2fcf3f7598caf8384282ec1178ec0b66c8408a Mon Sep 17 00:00:00 2001 From: Ivan Walulya Date: Fri, 16 Dec 2022 12:59:44 +0000 Subject: [PATCH] 8296374: Check for young region in G1BarrierSet::invalidate instead of card-by-card check Reviewed-by: ayang, tschatzl --- src/hotspot/share/gc/g1/g1BarrierSet.cpp | 36 ++++++++++++++---------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/hotspot/share/gc/g1/g1BarrierSet.cpp b/src/hotspot/share/gc/g1/g1BarrierSet.cpp index 0e441ba0868..5032cb99bf4 100644 --- a/src/hotspot/share/gc/g1/g1BarrierSet.cpp +++ b/src/hotspot/share/gc/g1/g1BarrierSet.cpp @@ -107,22 +107,28 @@ void G1BarrierSet::invalidate(MemRegion mr) { } volatile CardValue* byte = _card_table->byte_for(mr.start()); CardValue* last_byte = _card_table->byte_for(mr.last()); - // skip initial young cards - for (; byte <= last_byte && *byte == G1CardTable::g1_young_card_val(); byte++); - if (byte <= last_byte) { - OrderAccess::storeload(); - // Enqueue if necessary. - Thread* thr = Thread::current(); - G1DirtyCardQueueSet& qset = G1BarrierSet::dirty_card_queue_set(); - G1DirtyCardQueue& queue = G1ThreadLocalData::dirty_card_queue(thr); - for (; byte <= last_byte; byte++) { - CardValue bv = *byte; - if ((bv != G1CardTable::g1_young_card_val()) && - (bv != G1CardTable::dirty_card_val())) { - *byte = G1CardTable::dirty_card_val(); - qset.enqueue(queue, byte); - } + // skip young gen cards + if (*byte == G1CardTable::g1_young_card_val()) { + // MemRegion should not span multiple regions for the young gen. + DEBUG_ONLY(HeapRegion* containing_hr = G1CollectedHeap::heap()->heap_region_containing(mr.start());) + assert(containing_hr->is_young(), "it should be young"); + assert(containing_hr->is_in(mr.start()), "it should contain start"); + assert(containing_hr->is_in(mr.last()), "it should also contain last"); + return; + } + + OrderAccess::storeload(); + // Enqueue if necessary. + Thread* thr = Thread::current(); + G1DirtyCardQueueSet& qset = G1BarrierSet::dirty_card_queue_set(); + G1DirtyCardQueue& queue = G1ThreadLocalData::dirty_card_queue(thr); + for (; byte <= last_byte; byte++) { + CardValue bv = *byte; + assert(bv != G1CardTable::g1_young_card_val(), "Invalid card"); + if (bv != G1CardTable::dirty_card_val()) { + *byte = G1CardTable::dirty_card_val(); + qset.enqueue(queue, byte); } } }