RFR(M): 8145521: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive

Ioi Lam ioi.lam at oracle.com
Sun Feb 21 01:22:39 UTC 2016


Hi Dean,

Thanks for raising this issue.

My first impression is this probably shouldn't matter (or somehow we can 
get away with this).

Today, the CDS archive already contains executable code in the "misc 
code" section. On Linux/x64, this is typically in the address range 
0x802400000-0x802409000. The code is used to dynamically patch the C++ 
vtables of Metadata types that are stored in the CDS archive. So even 
today, there's a chance that the suspended PC lands in this section.

The code is generated inside MetaspaceShared::generate_vtable_methods 
and looks like this  when you run with -Xshare:on:

(gdb) x/5i 0x802400000
    0x802400000:    mov    $0x0,%eax
    0x802400005:    jmpq   0x8024084d0
    0x80240000a:    mov    $0x1,%eax
    0x80240000f:    jmpq   0x8024084d0
    0x802400014:    mov    $0x2,%eax
    ....
(gdb) x/16i 0x8024084d0
    0x8024084d0:    push   %rsi
    0x8024084d1:    push   %rdi
    0x8024084d2:    mov    %rax,%rdi
    0x8024084d5:    shr    $0x8,%rdi
    0x8024084d9:    shl    $0x3,%rdi
    0x8024084dd:    movabs $0x802000000,%rsi
    0x8024084e7:    add    %rdi,%rsi
    0x8024084ea:    mov    (%rsi),%rsi
    0x8024084ed:    pop    %rdi
    0x8024084ee:    mov    %rsi,(%rdi)
    0x8024084f1:    and    $0xff,%rax
    0x8024084f8:    shl    $0x3,%rax
    0x8024084fc:    add    %rsi,%rax
    0x8024084ff:    pop    %rsi
    0x802408500:    mov    (%rax),%rax
    0x802408503:    jmpq   *%rax

In JDK9, the profiler takes a sample by first calling into 
JavaThread::pd_get_top_frame_for_profiling:

(gdb) where
#0  frame::safe_for_sender (this=0x7ffec63895f0, thread=0x7ffff08ce000)
#1  0x00007ffff69d72a7 in JavaThread::pd_get_top_frame 
(this=0x7ffff08ce000, fr_addr=0x7ffec63897b0, ucontext=0x7ffec6287d00, 
isInJava=true)
#2  0x00007ffff69d70be in JavaThread::pd_get_top_frame_for_profiling 
(this=0x7ffff08ce000, fr_addr=0x7ffec63897b0, ucontext=0x7ffec6287d00,
     isInJava=true)

I tried manually setting frame::_pc to 0x802400000, and it would cause 
frame::safe_for_sender() to return false, and thus would prevent the 
profiler from doing any stack walking.

Also, both the CDS vtable patching code and the i2i trampolines are tail 
calls, so you will never find a PC in them except for the top-most 
frame. This means the check in JavaThread::pd_get_top_frame is enough. 
There's no need to do additional checks after we have started stack walking.

I think the chance of landing in the CDS vtable patching methods, or in 
the trampolines, is pretty small, so that shouldn't bother the sampling 
profiler too much.

Anyway, as part of this bug, we should add a regression test with the 
profiler enabled, and keep calling a method in the CDS archive in a 
tight loop (and manually disable compilation of that method using 
command-line options). The test should never crash, and if possible, it 
should also check that we don't have too many "unknown" samples.

Thanks
- Ioi


On 2/19/16 4:39 PM, Dean Long wrote:
> We have profiling code that will suspend a thread at random points and 
> try to walk the stack.
> I think frame::sender() will get confused if you happen to catch a 
> thread in the trampoline,
> and frame::_pc is in metadata and not the code cache.
>
> dl
>
> On 2/19/2016 2:19 PM, Calvin Cheung wrote:
>> JBS: https://bugs.openjdk.java.net/browse/JDK-8145221
>> webrev: http://cr.openjdk.java.net/~ccheung/8145221/webrev.00/
>>
>> This optimization reduces the size of the RW region of the CDS 
>> archive. It also reduces the amount of pages in the RW region that 
>> are actually written into during runtime.
>>
>> The original prototype on the x86_64 platform was done by Ioi 
>> (ioi.lam at oracle.com).
>> I helped porting it to other platforms.
>> Special thanks to Goetz (goetz.lindenmaier at sap.com) who provided the 
>> changes to the ppc platform.
>>
>> Testing:
>>     JPRT with testset hotspot
>>     maunal testing on X86_64, x86_32 and solaris/sparcv9 with 
>> -XX:+PrintAssembly -XX:+PrintInterpreter
>>     built on the Zero platform
>>     tested on the openjdk aarch64 platform
>>     refworkload on various platform (please refer to bug report for 
>> data)
>>
>> thanks,
>> Calvin
>



More information about the hotspot-runtime-dev mailing list