RFR (XS): 8023037 : Race between ciEnv::register_method and nmethod::make_not_entrant_or_zombie

Vladimir Kozlov vladimir.kozlov at oracle.com
Tue Nov 5 13:11:35 PST 2013


Note nmethodLocker is not lock:

void nmethodLocker::lock_nmethod(nmethod* nm, bool zombie_ok) {
   if (nm == NULL)  return;
   Atomic::inc(&nm->_lock_count);
   guarantee(zombie_ok || !nm->is_zombie(), "cannot lock a zombie method");
}

The guard is nm->is_locked_by_vm() but neither 
make_not_entrant_or_zombie () or register_method() use it.

So how nmethodLocker helps here?

Vladimir

On 11/5/13 12:42 PM, Vladimir Ivanov wrote:
> Thanks! Missed that one. Fixed.
>
> http://cr.openjdk.java.net/~vlivanov/8023037/webrev.01
>
> Best regards,
> Vladimir Ivanov
>
> On 11/5/13 11:25 PM, Vladimir Kozlov wrote:
>> Should be
>>
>> http://cr.openjdk.java.net/~vlivanov/8023037/webrev.01/
>>
>> What about this place:
>>
>> src/cpu/sparc/vm/sharedRuntime_sparc.cpp:  if (StressNonEntrant) {
>>
>> Vladimir
>>
>> On 11/5/13 11:10 AM, Vladimir Ivanov wrote:
>>> Updated fix:
>>> http://cr.openjdk.java.net/~vlivanov/8023037/webrev.00/
>>>
>>> Removed broken StressNonEntrant code.
>>> Updated comments.
>>>
>>> Best regards,
>>> Vladimir Ivanov
>>>
>>> On 11/5/13 3:39 PM, Vladimir Ivanov wrote:
>>>> http://cr.openjdk.java.net/~vlivanov/8023037/webrev.00/
>>>>
>>>> There's a race between compiler thread during method registration and
>>>> sweeper: sweeper can invalidate a nmethod which hasn't been installed
>>>> yet.
>>>>
>>>> Consider the following scenario:
>>>>    ciEnv::register_method:
>>>>      - new nmethod(...)
>>>>
>>>>    sweeper:
>>>>      - invalidates newly allocated nmethod and patches VEP to call
>>>> handle_wrong_method
>>>>      - tries to unlink it, but method()->from_compiled_entry() !=
>>>> verified_entry_point() since nmethod hasn't been installed yet
>>>>
>>>>    ciEnv::register_method:
>>>>      - installs already invalidated nmethod
>>>>
>>>> Calling corresponding Java method will lead to infinite loop: VEP of
>>>> the
>>>> compiled method calls handle_wrong_method and call site resolution
>>>> returns the very same compiled method.
>>>>
>>>> The fix is to grab a lock after nmethod is allocated in the code cache
>>>> and check that it hasn't been already invalidated by the sweeper before
>>>> proceeding. Sweeper already synchronizes on a nmethod before
>>>> invalidating it.
>>>>
>>>> Testing: failing test w/ diagnostic output.
>>>>
>>>> Thanks!
>>>>
>>>> Best regards,
>>>> Vladimir Ivanov


More information about the hotspot-compiler-dev mailing list