The summary of the problem. Test is intermittently failing because can't get 
expected field watch event.
The test is failing to get event in the 'setfmodw001b' thread with Xcomp only.
I verified that frame with the method 'run' of setfmodw001b is compiled when 
line
118: setfmodw001.setWatch(4);
is executed, however the thread is in interp_only mode. The watch events are 
supported by interpreter only and just ignored by compiled code.

The reason of failure is race beteween setting interp_only mode in line

https://github.com/openjdk/jdk/blob/master/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001.java#L75

 and calling method call_helper while
 the method run()
https://github.com/openjdk/jdk/blob/master/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetFieldModificationWatch/setfmodw001.java#L116

 in newly created thread 'setfmodw001b' is invoked.

The javaCalls:call are used to invoke methods from hotspot, so it might be rare 
issues. But still, synchronization might be improved.
The
void JavaCalls::call_helper(JavaValue* result, const methodHandle& method, 
JavaCallArguments* args, TRAPS)

checks if interp_only mode is set and use 'Method::from_interpreted_entry()' if 
not. However the interp_only might be set later before compiled method is 
called (or enter first safe point?). This might happens in safepoint during 
transition via handshake.
So the running thread is in interp_only mode however the run() method is 
compiled and executed already and never going to be deoptimized.

The additional setWatch calls don't try to deptimize method that are already in 
interp_only mode.

BTW, the when JVMCI is enabled and verified adapter exists it is also will be 
loaded even in interp_only mode set. There is not race here, just ignoring of 
interp_only mode.

I run failing test with Xcomp ~1000 times and tiers1-5.

-------------

Commit messages:
 - fix
 - f
 - with jvmci
 - fix

Changes: https://git.openjdk.org/jdk/pull/20587/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=20587&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8205957
  Stats: 49 lines in 3 files changed: 16 ins; 22 del; 11 mod
  Patch: https://git.openjdk.org/jdk/pull/20587.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/20587/head:pull/20587

PR: https://git.openjdk.org/jdk/pull/20587

Reply via email to