[9] RFR (XS): 8139247: Improper locking of MethodData::_extra_data_lock

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Sun Mar 6 12:49:24 UTC 2016


Roland, Dan, David, thanks for the reviews.

Updated fix:
  http://cr.openjdk.java.net/~vlivanov/8139247/webrev.01/

I found that ciSpeculativeTrapData::translate_from may block on 
Compile_lock (in ciMethod ctor [1]), so MDO extra lock has to be 
unlocked first since it has leaf rank.

>> We've been bitten by the "MutexLocker /*missing name*/ (lock);" before.
>> It's interesting that fixing that runs into JDK-8146616. We should
>
> Yeah - how did Vladimir detect that? Detailed check of the generated code?
Well, initially I missed that the locker doesn't have a name and went 
right to the generated code, since I vaguely remembered that there was 
some bug in SS12u4. And the control flow shape was similar

When I added a name, I looked at it again and noticed unlock() is missed.

>> probably make an audit run on finding missing name instances (again).
>
> Yep here's another one in  ./share/vm/utilities/decoder.cpp
>
> DecoderLocker::DecoderLocker() :
>    MutexLockerEx(DecoderLocker::is_first_error_thread() ?
>                  NULL : Decoder::shared_decoder_lock(), true) {
>    _decoder = is_first_error_thread() ?
>      Decoder::get_error_handler_instance() :
> Decoder::get_shared_instance();
>    assert(_decoder != NULL, "null decoder");
> }
Are you sure? It is a constructor call:

class DecoderLocker : public MutexLockerEx {

All DecodeLocker usages are named.

Best regards,
Vladimir Ivanov

[1] 
http://hg.openjdk.java.net/jdk9/hs-comp/hotspot/file/tip/src/share/vm/ci/ciMethod.cpp#l108

>
> Cheers,
> David
> -----
>
>
>> Thumbs up!
>>
>> Dan
>>
>>
>>> https://bugs.openjdk.java.net/browse/JDK-8139247
>>>
>>> Solaris Studio C++ compiler generates tightly coupled
>>> Monitor::lock/unlock calls for unnamed MutexLocker which breaks
>>> synchronization between ciMethodData::load_extra_data() and
>>> MethodData::bci_to_extra_data().
>>>
>>>   MutexLocker(mdo->extra_data_lock());
>>>
>>> is compiled into:
>>>
>>>   load_extra_data+0x001d: movq %r13,%rdi
>>>   load_extra_data+0x0020: call lock [ 0xfffffd7fe6df46c0, .+0x7cc5c0 ]
>>>   load_extra_data+0x0025: movq %r13,%rdi
>>>   load_extra_data+0x0028: call unlock [ 0xfffffd7fe6df47f0, .+0x7cc6e8
>>>
>>> But after adding a name, we hit a compiler bug in SS12u4 and
>>> Monitor::unlock call is missed. So, have to add a workaround (same as
>>> in JDK-8146616 [1]).
>>>
>>> Testing: verified machine code for ciMethodData::load_extra_data().
>>>
>>> Best regards,
>>> Vladimir Ivanov
>>>
>>> [1] https://bugs.openjdk.java.net/browse/JDK-8146616
>>


More information about the hotspot-dev mailing list