RFR[13]: 8224674: NMethod state machine is not monotonic
Erik Österlund
erik.osterlund at oracle.com
Mon Jul 1 13:12:23 UTC 2019
Hi,
Today it is up to callers of methods changing state on nmethods like
make_not_entrant(), to know all other possible concurrent attempts to
transition the nmethod, and know that there are no such attempts trying
to make the nmethod more dead.
There have been multiple occurrences of issues where the caller got it
wrong due to the fragile nature of this code. This specific CR deals
with a bug where an OSR nmethod was made not entrant (deopt) and made
unloaded concurrently.
The result of such a race can be that it is first made unloaded and then
made not entrant, making the nmethod go backwards in its state machine,
effectively resurrecting dead nmethods, causing a subsequent GC to feel
awkward (crash).
But I have seen other similar incidents with deopt racing with the
sweeper. These non-monotonicity problems are unnecessary to have. So I
intend to fix the bug by enforcing monotonicity of the nmethod state
machine explicitly, instead of trying to reason about all callers of
these make_* functions.
I swapped the order of unloaded and zombie in the enum as zombies are
strictly more dead than unloaded nmethods. All transitions change in the
direction of increasing deadness and fail if the transition is not
monotonically increasing.
For ZGC I moved OSR nmethod unlinking to before the unlinking (where
unlinking code belongs), instead of after the handshake (intended for
deleting things safely unlinked).
Strictly speaking, moving the OSR nmethod unlinking removes the racing
between make_not_entrant and make_unloaded, but I still want the
monotonicity guards to make this code more robust.
I left AOT methods alone. Since they don't die, they don't have
resurrection problems, and hence do not benefit from these guards in the
same way.
Bug:
https://bugs.openjdk.java.net/browse/JDK-8224674
Webrev:
http://cr.openjdk.java.net/~eosterlund/8224674/webrev.00/
Thanks,
/Erik
More information about the hotspot-dev
mailing list