Aarch64 port for ZGC, so far

Per Liden per.liden at oracle.com
Fri Nov 30 07:28:56 UTC 2018


Hi,

Just had a quick look and noticed that the signatures for 
arraycopy_prologue/arraycopy_epilogue on aarch64 look wrong.

   virtual void arraycopy_prologue(MacroAssembler* masm, DecoratorSet 
decorators, bool is_oop, Register addr, Register count, RegSet saved_regs);
   virtual void arraycopy_epilogue(MacroAssembler* masm, DecoratorSet 
decorators, bool is_oop, Register start, Register end, Register tmp, 
RegSet saved_regs);

They should always take in both source and destination, as it's up the 
to barrier set to decide what needs to be done here. Like we do on x86:

   virtual void arraycopy_prologue(MacroAssembler* masm, DecoratorSet 
decorators, BasicType type, Register src, Register dst, Register count);
   virtual void arraycopy_epilogue(MacroAssembler* masm, DecoratorSet 
decorators, BasicType type, Register src, Register dst, Register count);

Leaving it to the barrier set also gives you the runtime optional 
property we want.

cheers,
Per

On 11/29/18 7:01 PM, Stuart Monteith wrote:
> Thanks for pointing that out Ma Chunhui,
> 
> What you suggest can't be done as ZGC isn't just a compile time
> option, it is also a run-time option. You are quite right though - the
> array prologue needs to take the src and dest and decide what it needs
> to do.
> 
> I'll incorporate this into the aarch64 specific code by adding the
> source too the method signature and the other dependencies in a manner
> that will be correct for with/without ZGC.
> 
> This will explain some of the rarer problems I 'm seeing.
> 
> On Thu, 29 Nov 2018 at 06:13, machunhui (C) <machunhui2 at huawei.com> wrote:
>>
>> Hi, Stuart
>>
>>    With your latest patch, It seems that Interpreter and C1 works fine on my machine and my case. But there is a crash when using C2.
>>
>>
>>
>> My Option is:  -XX:+UseZGC -XX:-TieredCompilation -XX:ParallelGCThreads=1 -XX:ConcGCThreads=1 -XX:+Use64BitLiteralOops
>>
>> And the crash happens only when java main thread is exited, after DestroyJavaVM.
>>
>>
>>
>> The crash stack:
>>
>> 30 V  [libjvm.so+0x121b968]  ZPage::is_active() const+0xc
>>
>>    31 V  [libjvm.so+0x123b180]  ZMark::try_mark_object(ZMarkCache*, unsigned long, bool)+0x48
>>
>>    32 V  [libjvm.so+0x123b28c]  ZMark::mark_and_follow(ZMarkCache*, ZMarkStackEntry)+0x6c
>>
>>    33 V  [libjvm.so+0x123e6d4]  bool ZMark::drain<ZMarkNoTimeout>(ZMarkStripe*, ZMarkThreadLocalStacks*, ZMarkCache*, ZMarkNoTimeout*)+0x7c
>>
>>
>>
>> The crash is because when trying to mark object, it failed to find page for the given object address, which is 0xbaadbabe. And the reason is because in StubGenerator:: generate_disjoint_copy, when trying to add load-barrier in aarch64, the barrier is wrongly added to dest, not src.
>>
>> So the fix is quite simple, when using ZGC, add load-barrier to src instead of dest.
>>
>>
>>
>> diff --git a/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp b/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp
>>
>> index a1fd069c7b..fc7f209d62 100644
>>
>> --- a/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp
>>
>> +++ b/src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp
>>
>> @@ -1377,7 +1377,11 @@ class StubGenerator: public StubCodeGenerator {
>>
>>       }
>>
>>
>>
>>       BarrierSetAssembler *bs = BarrierSet::barrier_set()->barrier_set_assembler();
>>
>> +#if INCLUDE_ZGC
>>
>> +    bs->arraycopy_prologue(_masm, decorators, is_oop, s, count, saved_reg);
>>
>> +#else
>>
>>       bs->arraycopy_prologue(_masm, decorators, is_oop, d, count, saved_reg);
>>
>> +#endif
>>
>>
>>
>>       if (is_oop) {
>>
>>         // save regs before copy_memory
>>
>> @@ -1451,7 +1455,11 @@ class StubGenerator: public StubCodeGenerator {
>>
>>       }
>>
>>
>>
>>       BarrierSetAssembler *bs = BarrierSet::barrier_set()->barrier_set_assembler();
>>
>> +#if INCLUDE_ZGC
>>
>> +    bs->arraycopy_prologue(_masm, decorators, is_oop, s, count, saved_regs);
>>
>> +#else
>>
>>      bs->arraycopy_prologue(_masm, decorators, is_oop, d, count, saved_regs);
>>
>> +#endif
>>
>>
>>
>>       if (is_oop) {
>>
>>         // save regs before copy_memory
>>
>>
>>
>> Thanks.
>>
>>
>>
>> --------------------------------------------------
>> 马春辉 Ma Chunhui
>> Mail: machunhui2 at huawei.com
>> 2012实验室-语言虚拟机实验室
>> 2012 Laboratories-Language VM Lab,2012Labs
>>
>>


More information about the zgc-dev mailing list