RFR[13]: 8227260: Can't deal with SharedRuntime::handle_wrong_method triggering more than once for interpreter calls
Erik Österlund
erik.osterlund at oracle.com
Thu Jul 4 15:02:52 UTC 2019
Hi,
The i2c adapter sets a thread-local "callee_target" Method*, which is
caught (and cleared) by SharedRuntime::handle_wrong_method if the i2c
call is "bad" (e.g. not_entrant). This error handler forwards execution
to the callee c2i entry. If the SharedRuntime::handle_wrong_method
method is called again due to the i2c2i call being still bad, then we
will crash the VM in the following guarantee in
SharedRuntime::handle_wrong_method:
Method* callee = thread->callee_target();
guarantee(callee != NULL && callee->is_method(), "bad handshake");
Unfortunately, the c2i entry can indeed fail again if it, e.g., hits the
new class initialization entry barrier of the c2i adapter.
The solution is to simply not clear the thread-local "callee_target"
after handling the first failure, as we can't really know there won't be
another one. There is no reason to clear this value as nobody else reads
it than the SharedRuntime::handle_wrong_method handler (and we really do
want it to be able to read the value as many times as it takes until the
call goes through). I found some confused clearing of this callee_target
in JavaThread::oops_do(), with a comment saying this is a methodOop that
we need to clear to make GC happy or something. Seems like old traces of
perm gen. So I deleted that too.
I caught this in ZGC where the timing window for hitting this issue
seems to be wider due to concurrent code cache unloading. But it is
equally problematic for all GCs.
Bug:
https://bugs.openjdk.java.net/browse/JDK-8227260
Webrev:
http://cr.openjdk.java.net/~eosterlund/8227260/webrev.00/
Thanks,
/Erik
More information about the hotspot-dev
mailing list