On 13 maj 2014, at 18:53, Daniel D. Daugherty <daniel.daughe...@oracle.com> wrote:
> > new webrev is here: http://cr.openjdk.java.net/~sla/8041934/webrev.02/ > > src/share/vm/runtime/sharedRuntime.hpp > No comments. > > src/share/vm/runtime/sharedRuntime.cpp > No comments. > > src/cpu/sparc/vm/sharedRuntime_sparc.cpp > No comments. > > src/cpu/x86/vm/sharedRuntime_x86_32.cpp > No comments. > > src/cpu/x86/vm/sharedRuntime_x86_64.cpp > No comments. > > On the switch from call_VM_leaf() -> call_VM(), I looked through all > the mentions of the string call_VM in the three src/cpu files. Your > change adds the first call_VM() use in all three files and the other > places that mention the string "call_VM" seem to have gone through > a great deal of trouble not to use call_VM() directly. I have no > specific thing I think is wrong, but I find this data worrisome… Yes, it would be great if someone from the compiler team could review this, too. Thanks, /Staffan > > Thumbs up! > > Dan > > > On 5/13/14 3:20 AM, Staffan Larsen wrote: >> >> On 9 maj 2014, at 20:18, serguei.spit...@oracle.com wrote: >> >>> Staffan, >>> >>> This is important discovery, thanks! >>> The fix looks good to me. >>> One question below. >>> >>> Thanks, >>> Serguei >>> >>> >>> On 5/9/14 3:47 AM, Staffan Larsen wrote: >>>> On 8 maj 2014, at 19:05, Daniel D. Daugherty <daniel.daughe...@oracle.com> >>>> wrote: >>>> >>>>>> webrev: http://cr.openjdk.java.net/~sla/8041934/webrev.00/ >>>>> src/share/vm/runtime/sharedRuntime.hpp >>>>> No comments. >>>>> >>>>> src/share/vm/runtime/sharedRuntime.cpp >>>>> line 994: JRT_LEAF(int, SharedRuntime::jvmti_method_exit( >>>>> I'm not sure that JRT_LEAF is right. I would think that >>>>> JvmtiExport::post_method_exit() would have to grab one or >>>>> more locks with all the state checks it has to make... >>>>> >>>>> For reference, InterpreterRuntime::post_method_exit() >>>>> is a wrapper around JvmtiExport::post_method_exit() >>>>> and it is IRT_ENTRY instead of IRT_LEAF. >>>> Good catch! >>> >>> Q: Is correct to use call_VM_leaf (vs call_VM ) in the >>> sharedRuntime_<arch>.cpp ? >>> >>> + __ call_VM_leaf( >>> + CAST_FROM_FN_PTR(address, SharedRuntime::jvmti_method_exit), >>> + thread, rax); >> >> That is another good catch! It should probably be call_VM as you note. The >> reason for all these leaf references is because we used the dtrace probe as >> a template - obviously without fully understanding what we did :-/ >> >> I have changed to code to use call_VM instead. This also required a change >> from jccb to jcc for the jump (which is now longer than an 8-bit offset). >> >> new webrev is here: http://cr.openjdk.java.net/~sla/8041934/webrev.02/ >> >> Thanks, >> /Staffan >> >> >>> >>>>> src/cpu/sparc/vm/sharedRuntime_sparc.cpp >>>>> No comments. >>>>> >>>>> src/cpu/x86/vm/sharedRuntime_x86_32.cpp >>>>> No comments. >>>>> >>>>> src/cpu/x86/vm/sharedRuntime_x86_64.cpp >>>>> No comments. >>>>> >>>>> I'm guessing that PPC has the same issue, but I'm presuming >>>>> that someone else (Vladimir?) will handle that… >>>> Yes, I was hoping that I could file a follow-up bug for the platforms I >>>> didn’t know how to fix. >>>> >>>> Updated review: http://cr.openjdk.java.net/~sla/8041934/webrev.01/ >>>> >>>> Thanks, >>>> /Staffan >>>> >>>>> Dan >>>>> >>>>> >>>>> On 5/8/14 12:06 AM, Staffan Larsen wrote: >>>>>> All, >>>>>> >>>>>> This is a fix for an assert in JVMTI that verifies that JVMTI’s internal >>>>>> notion of the number of frames on the stack is correct. >>>>>> >>>>>> When running in -Xcomp mode and enable single-stepping (or >>>>>> method_entry/exit) we will revert all frames on the stack to be run by >>>>>> the interpreter. Only the interpreter can send single-step and >>>>>> method_entry/exit. However, if one of the frames is a native wrapper, >>>>>> that frame will not be reverted (presumably because we don't know how to >>>>>> do that). This will cause us to miss a method_exit event when that >>>>>> native frame is popped. This in turn will mess up the logic in JVMTI >>>>>> that keeps track of the number of frames currently on the stack (see >>>>>> JvmtiThreadState::_cur_stack_depth) and will trigger the assert. >>>>>> >>>>>> The proposed solution is to include a method_exit event in the native >>>>>> wrapper frame if interpreted mode has been enabled. This needs updates >>>>>> to SharedRuntime::generate_native_wrapper() for all platforms. >>>>>> >>>>>> Kudos to Rickard for helping me write the code. >>>>>> >>>>>> webrev: http://cr.openjdk.java.net/~sla/8041934/webrev.00/ >>>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8041934 >>>>>> >>>>>> The fix has been verified by running the failing test in JPRT with >>>>>> -Xcomp. >>>>>> >>>>>> Thanks, >>>>>> /Staffan >>> >> >