RFR: 8246442: nmethod::can_convert_to_zombie() asserts when not called by the sweeper
Erik Österlund
erik.osterlund at oracle.com
Wed Jun 3 12:28:16 UTC 2020
Hi David,
Thanks for the review.
/Erik
> On 3 Jun 2020, at 13:40, David Holmes <david.holmes at oracle.com> wrote:
>
> Hi Erik,
>
> LGTM.
>
> Your explanation and solution seems entirely reasonable.
>
> Thanks,
> David
>
>> On 3/06/2020 9:26 pm, Erik Österlund wrote:
>> Hi,
>> nmethod::can_convert_to_zombie() used to be called only by the sweeper, after it has checked that
>> an nmethod is not entrant. Due to the single call site, there was an assert checking that the nmethod
>> should be not entrant (the condition just checked).
>> However, it is now used in nmethod::post_compiled_method_load_event(), where the result of the assert is racy.
>> When an nmethod is created, the load event will never be able to see the nmethod spuriously flipping
>> to zombie, because there simply are no safepoint polls/transitions between the nmethod being created
>> and the load event firing. However, the jvmti_GenerateEvents can observe such spurious flips to zombie.
>> It is completely harmless, because the whole operation runs under the CodeCache_lock, which prevents
>> further nmethods from being flushed. But they can flip to zombie, which is indeed exactly what the
>> check is design to test. Therefore, this is just a false positive assertion failure.
>> Proposed fix: make the assert only apply when called from the sweeper thread.
>> Webrev:
>> http://cr.openjdk.java.net/~eosterlund/8246442/webrev.00/
>> Bug:
>> https://bugs.openjdk.java.net/browse/JDK-8246442
>> Thanks,
>> /Erik
More information about the hotspot-dev
mailing list