RFR: 8352185: Shenandoah: Invalid logic for remembered set verification
Xiaolong Peng
xpeng at openjdk.org
Tue Mar 18 22:18:44 UTC 2025
On Tue, 18 Mar 2025 17:24:54 GMT, William Kemper <wkemper at openjdk.org> wrote:
>> There are some scenarios in which GenShen may have improper remembered set verification logic:
>>
>> 1. Concurrent young cycles following a Full GC:
>>
>> In the end of ShenandoahFullGC, it resets bitmaps for the entire heap w/o resetting marking context to be incomplete, but ShenandoahVerifier has code like below to get a complete old marking context for remembered set verification
>>
>>
>> ShenandoahVerifier
>> ShenandoahMarkingContext* ShenandoahVerifier::get_marking_context_for_old() {
>> shenandoah_assert_generations_reconciled();
>> if (_heap->old_generation()->is_mark_complete() || _heap->gc_generation()->is_global()) {
>> return _heap->complete_marking_context();
>> }
>> return nullptr;
>> }
>>
>>
>> For the concurrent young GC cycles after a full GC, the old marking context used for remembered set verification is stale, and may cause unexpected result.
>>
>> 2. For the impl of `ShenandoahVerifier::get_marking_context_for_old` mentioned above, it always return a marking context for global GC, but marking bitmaps is already reset before before init-mark, `ShenandoahVerifier::help_verify_region_rem_set` always skip verification in this case.
>>
>> 3. ShenandoahConcurrentGC always clean remembered set read table, but only swap read/write table when gc generation is young, this issue causes remembered set verification before init-mark to use a completely clean remembered set, but it is covered by issue 2.
>>
>>
>> ### Test
>> - [x] `make test TEST=hotspot_gc_shenandoah`
>
> src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp line 1389:
>
>> 1387: shenandoah_assert_safepoint();
>> 1388: shenandoah_assert_generational();
>> 1389: ShenandoahMarkingContext* ctx = get_marking_context_for_old();
>
> This should always be `nullptr` after a full GC, right? The marking context is no longer valid after compaction.
Yes, get_marking_context_for_old always return `nullptr` after a full GC, the marking completeness has been set to false when we reset marking bitmaps after full GC.
I think the method get_marking_context_for_old and the ctx arg of the helper function can be removed, I'll do that in next update.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/24092#discussion_r2001815702
More information about the shenandoah-dev
mailing list