[9] RFR (S): 8071374: Native disassembler implementation may be not thread-safe
Vladimir Ivanov
vladimir.x.ivanov at oracle.com
Wed Dec 16 13:29:06 UTC 2015
Ioi,
Sorry for the confusion, the fix does exactly that - adds ttyLocker in
all 3 Disassembler::decode variants [1].
Other changes are cleanups - use ttyLocker for multi-line dumps.
Also, what do you think about result handler output w/
-XX:+PrintSignatureHandlers? Leave it as is?
Best regards,
Vladimir Ivanov
[1]
http://cr.openjdk.java.net/~vlivanov/8071374/webrev.00/src/share/vm/compiler/disassembler.cpp.udiff.html
On 12/16/15 3:14 AM, Ioi Lam wrote:
> Hi Vladimir,
>
> Thanks for fixing this bug. I have a suggestion: instead of doing this:
>
> 2642 ttyLocker ttyl;
> 2643 tty->print_cr("implicit exception happened at " INTPTR_FORMAT,
> p2i(pc));
> 2644 print();
> 2645 method()->print_codes();
> 2646 print_code();
> 2647 print_pcs();
>
> Maybe the ttyLocker should be acquired inside Disassembler::decode?
>
> Your code has the advantage of keeping the related info in the same part
> of the print-out, but that's a different problem than the one you want
> to solve in this bug. If another thread forgets to take the tty lock
> before calling Disassembler::decode, it would still cause your code to
> crash.
>
> Thanks
> - Ioi
>
>
> On 12/15/15 4:30 AM, Vladimir Ivanov wrote:
>> http://cr.openjdk.java.net/~vlivanov/8071374/webrev.00
>> https://bugs.openjdk.java.net/browse/JDK-8071374
>>
>> Disassembler wraps some native disassembler, which is not necessarily
>> thread-safe. It's not a problem for -XX:+PrintAssembly since access
>> from compilers is serialized by Compile_lock.
>>
>> It is not the case anymore when there are calls from runtime (e.g.,
>> with -XX:+PrintSignatureHandlers). The problem can manifest as a
>> failure to parse instruction stream.
>>
>> The fix is to serialize access to Disassembler on tty_lock.
>>
>> Considering most of the calls to Disassembler::decode are performed
>> under tty_lock (which has the lowest rank), it's too burdensome to
>> introduce a dedicated lock and a new rank to please deadlock detection
>> logic.
>>
>> Also, some cleanups are included.
>>
>> Testing: failing test case from the report, JPRT.
>>
>> Thanks!
>>
>> Best regards,
>> Vladimir Ivanov
>>
>> PS: I noted that the following code usually dumps some garbage at the
>> end of the code block:
>>
>> src/share/vm/interpreter/interpreter.cpp:
>> void SignatureHandlerLibrary::add(const methodHandle& method) {
>> ...
>> tty->print_cr(" --- associated result handler ---");
>> address rh_end = rh_begin;
>> while (*(int*)rh_end != 0) {
>> rh_end += sizeof(int);
>> }
>> Disassembler::decode(rh_begin, rh_end);
>>
>> $ java -XX:+PrintSignatureHandlers ...
>> ...
>> argument handler #0 for: static java.lang.Object.registerNatives()V
>> (fingerprint = 349, 11 bytes generated)
>> 0x0000000106d55e60: movabs $0x106c1b118,%rax
>> 0x0000000106d55e6a: retq
>> --- associated result handler ---
>> 0x0000000106c1b118: retq // T_VOID: _native_abi_to_tosca[6]
>> 0x0000000106c1b119: retq // T_FLOAT: _native_abi_to_tosca[7]
>> 0x0000000106c1b11a: retq // T_DOUBLE: _native_abi_to_tosca[8]
>> // T_OBJECT/T_ARRAY: _native_abi_to_tosca[9]
>> 0x0000000106c1b11b: mov 0x10(%rbp),%rax
>> 0x0000000106c1b11f: retq
>>
>> === end of AbstractInterpreter::_native_abi_to_tosca[]
>>
>> Garbage until (*(int*)rh_end) == 0:
>>
>> 0x0000000106c1b120: rex add %eax,(%rax)
>> 0x0000000106c1b123: add %cl,%ah
>> 0x0000000106c1b125: int3
>> 0x0000000106c1b126: int3
>> 0x0000000106c1b127: int3
>> 0x0000000106c1b128: insl (%dx),%es:(%rdi)
>> 0x0000000106c1b129: sub $0x10521,%eax
>> 0x0000000106c1b12e: add %al,(%rax)
>> 0x0000000106c1b130: (bad)
>> 0x0000000106c1b131: (bad)
>> 0x0000000106c1b132: (bad)
>> 0x0000000106c1b133: dec %esp
>> 0x0000000106c1b135: int3
>> 0x0000000106c1b136: int3
>> 0x0000000106c1b137: int3
>>
>> Maybe add some padding in either CodeletMark::~CodeletMark or
>> TemplateInterpreterGenerator::generate_all()?
>>
>>
>
More information about the hotspot-compiler-dev
mailing list