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

Albert Noll albert.noll at oracle.com
Tue Nov 5 05:11:14 PST 2013


Hi Vladimir,

I have a question: the sweeper  calls make_not_entrant() on a nmethod 
only after the nmethod
has been in the code cache for at least 10 occurrences of a safepoint 
(time_since_reset in sweeper.ccp).

Couldn't it also be that we mistakenly call the function 
make_not_entrant() from somewhere else and that this is the root cause 
of the error?


Best,
Albert

On 11/05/2013 01:47 PM, Roland Westrelin wrote:
> Hi Vladimir,
>
>> 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.
> Does that mean StressNonEntrant is broken?
>
>> 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.
> Would another fix be to have the sweeper check that the method was made ready to execute before it attempts to make it not entrant?
>
> i.e. nmethod->method()->code() == nmethod
>
> Roland.



More information about the hotspot-compiler-dev mailing list