[premain] need help merging g1BarrierSetC2.cpp
ioi.lam at oracle.com
ioi.lam at oracle.com
Wed Oct 9 16:02:22 UTC 2024
I am seeing some failures on linux/x64 with various assertion failures
in the GC code, either during collection or gc verification. I merged
up to d504df0e3d7928f0e7ff10ace03e002953c6a58f from Andrew's repo.
runtime/cds/appcds/applications/HelidonQuickStartSE.java#leyden
runtime/cds/appcds/applications/HelidonQuickStartSE.java#leyden_old
runtime/cds/appcds/applications/JavacBench.java#leyden
runtime/cds/appcds/applications/JavacBench.java#leyden_old
runtime/cds/appcds/applications/SpringPetClinic.java#leyden_old
runtime/cds/appcds/leyden/ExcludedClasses.java
A sample stack trace
# SIGSEGV (0xb) at pc=0x00007ff1d9260f78, pid=472145, tid=472252
V [libjvm.so+0x636f78] oopDesc::size_given_klass(Klass*)+0x28
(oop.inline.hpp:196)
V [libjvm.so+0xd9e66d]
G1ParScanThreadState::do_copy_to_survivor_space(G1HeapRegionAttr, oop,
markWord)+0x9d (g1ParScanThreadState.cpp:480)
V [libjvm.so+0xda43db] void
G1ParScanThreadState::do_oop_evac<narrowOop>(narrowOop*)+0x12b
(g1ParScanThreadState.cpp:221)
V [libjvm.so+0xd9fa98]
G1ParScanThreadState::trim_queue_to_threshold(unsigned int)+0x488
(g1ParScanThreadState.cpp:334)
V [libjvm.so+0xdb96fa]
G1ParScanThreadState::trim_queue_partially()+0x3a
(g1ParScanThreadState.inline.hpp:53)
V [libjvm.so+0xdbe943] void
G1ScanHRForRegionClosure::ChunkScanner::on_dirty_cards<G1ScanHRForRegionClosure::scan_heap_roots(G1HeapRegion*)::{lambda(unsigned
char*, unsigned
char*)#1}>(G1ScanHRForRegionClosure::scan_heap_roots(G1HeapRegion*)::{lambda(unsigned
char*, unsigned char*)#1}&&)+0x2c3 (g1RemSet.cpp:519)
V [libjvm.so+0xdb6f39] G1RemSet::scan_heap_roots(G1ParScanThreadState*,
unsigned int, G1GCPhaseTimes::GCParPhases, G1GCPhaseTimes::GCParPhases,
bool)+0x5e9 (g1RemSet.cpp:664)
V [libjvm.so+0xdea89b]
G1EvacuateRegionsTask::scan_roots(G1ParScanThreadState*, unsigned
int)+0x4b (g1YoungCollector.cpp:670)
V [libjvm.so+0xdeac6a] G1EvacuateRegionsBaseTask::work(unsigned
int)+0x8a (g1YoungCollector.cpp:656)
V [libjvm.so+0x1a2b480] WorkerThread::run()+0x80 (workerThread.cpp:70)
V [libjvm.so+0x18cc40a] Thread::call_run()+0xba (thread.cpp:245)
V [libjvm.so+0x159e0f9] thread_native_entry(Thread*)+0x1c9
(os_linux.cpp:858)
siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr:
0x000000000000010e
I'll run tests on aarch64 as well and will report back when I get the
results.
Thanks
- Ioi
On 10/9/24 8:23 AM, ioi.lam at oracle.com wrote:
> Thanks Andrew.
>
> I'll test your merge on our CI and then push to premain.
>
> - Ioi
>
> On 10/9/24 7:46 AM, Andrew Dinn wrote:
>> Hi Ioi/Vladimir,
>>
>> I merged the rest of master into premain, fixed the conflicts and
>> pushed the result to my premain branch.
>>
>> https://urldefense.com/v3/__https://github.com/adinn/leyden/tree/premain__;!!ACWV5N9M2RV99hQ!L_H5Q7HrxgwFxgFHEDodn9bmN5PlYgD0PbjCSMB0D8AJpVB-zvJog8wGxXubkqGBozWm8phOCOc$
>>
>> The merged code built and ran ok on aarch64. On x86 it built ok but
>> crashed during the assembly run.
>>
>> The problem was that the x86 post barrier can now be called from C2
>> with tmp and tmp2 allocated by the register allocator. So, that means
>> both rcx and rscratch1 are possible values for register tmp. This is
>> a problem because the x86 AOT variant of the barrier code pushes rcx
>> and rscratch1 to the stack, loads the region grain shift address in
>> to rscratch1 and the grain shift into into rcx. It has to be able to
>> use rcx in order to be able to execute shrptr(tmp). However, if tmp
>> == rcx then the unshifted value is restored into tmp when rcx is popped.
>>
>> I pushed a follow-up patch to my premain that avoids this problem. It
>> uses a pushed register to do the shift and ensures that register
>> differs from tmp and rcx.
>>
>> regards,
>>
>>
>> Andrew Dinn
>> -----------
>>
>>
>> On 09/10/2024 07:08, ioi.lam at oracle.com wrote:
>>> In the premain branch, we have made some changes in g1BarrierSetC2.cpp
>>>
>>> commit cc111760a0dd123935e039feb19eaac742f865b2
>>> Author: Vladimir Kozlov <vladimir.kozlov at oracle.com>
>>> Date: Mon Aug 26 14:21:28 2024
>>>
>>> Cleanup AOT runtime constants code
>>>
>>> commit c319a3ee2be0236feab88c9be66d71e6e93b53fc
>>> Author: Andrew Dinn <adinn at redhat.com>
>>> Date: Wed Aug 21 07:48:22 2024
>>>
>>> AOT G1 barrier loads region grain and card shifts via runtime
>>> constants data area
>>>
>>> Recently, the following changes in g1BarrierSetC2.cpp have been
>>> pushed to mainline that caused conflicts with the leyden changes.
>>>
>>> commit 81ebbb2463df8b014bb209dc4028668fc78e8327
>>> Author: Roberto Castañeda Lozano <rcastanedalo at openjdk.org>
>>> Date: Mon Oct 7 01:28:18 2024
>>>
>>> 8341525: G1: use bit clearing to remove tightly-coupled
>>> initialization store pre-barriers
>>>
>>> commit 0b467e902d591ae9feeec1669918d1588987cd1c
>>> Author: Roberto Castañeda Lozano <rcastanedalo at openjdk.org>
>>> Date: Thu Oct 3 01:36:33 2024
>>>
>>> 8334060: Implementation of Late Barrier Expansion for G1
>>>
>>>
>>> When I tried merging with mainline, I couldn't merge these changes,
>>> so I ended up merging to this one (just an hour prior to 0b467e9),
>>> and pushed the result to premain.
>>>
>>> commit c6e7e551928c04b74775b5d4c03eb31232aeb2c9 (master)
>>> Author: Aleksey Shipilev <shade at openjdk.org>
>>> Date: Thu Oct 3 00:25:42 2024
>>>
>>> 8341091: CDS: Segmented roots array misses roots
>>>
>>> Andrew Dinn or Vladimir Kozlov, could you help merging with mainline?
>>>
>>> Thanks
>>>
>>> - Ioi
>>>
>>
More information about the leyden-dev
mailing list