RFR: 8246442: nmethod::can_convert_to_zombie() asserts when not called by the sweeper
Erik Österlund
erik.osterlund at oracle.com
Wed Jun 3 11:26:33 UTC 2020
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