RFR(T): 8229925: [s390] Exception check missing in interpreter

David Holmes david.holmes at oracle.com
Wed Aug 21 13:39:00 UTC 2019


Hi Martin,

On 21/08/2019 10:54 pm, Doerr, Martin wrote:
> Hi David,
> 
> thank you very much for reviewing and for checking the other platforms.
> I agree. PPC64 should also perform the exception check. Even though we have never seen this failure on PPC64.
> I've updated the issue and the webrev.00 in place.

Update looks good.

> After looking at InterpreterRuntime::build_method_counters, I wonder why it has been designed as JRT_ENTRY and not as JRT_LEAF. I couldn't find anything which requires the transition ThreadInVMfromJava and the safepoint check when leaving.

The fact we may generate an OOME suggests straight away that we may hit 
a safepoint which violates the rules for JRT_LEAF.

> Changing it to a leaf call would also be a valid fix (PPC64 example [1] below). What do you think?

If it were a leaf then the exception check would be missing, 
reintroducing the test failure that highlighted the issue.

> Best regards,
> Martin
> 
> 
> 
> [1] leaf call
> diff -r 40006c0ada91 src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp
> --- a/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp        Wed Aug 21 00:08:35 2019 +0200
> +++ b/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp        Wed Aug 21 14:36:57 2019 +0200
> @@ -2264,8 +2264,7 @@
>     ld(Rcounters, in_bytes(Method::method_counters_offset()), method);
>     cmpdi(CCR0, Rcounters, 0);
>     bne(CCR0, has_counters);
> -  call_VM(noreg, CAST_FROM_FN_PTR(address,
> -                                  InterpreterRuntime::build_method_counters), method, false);
> +  call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::build_method_counters), R16_thread, method);
>     ld(Rcounters, in_bytes(Method::method_counters_offset()), method);
>     cmpdi(CCR0, Rcounters, 0);
>     beq(CCR0, skip); // No MethodCounters, OutOfMemory.
> diff -r 40006c0ada91 src/hotspot/share/interpreter/interpreterRuntime.cpp
> --- a/src/hotspot/share/interpreter/interpreterRuntime.cpp      Wed Aug 21 00:08:35 2019 +0200
> +++ b/src/hotspot/share/interpreter/interpreterRuntime.cpp      Wed Aug 21 14:36:57 2019 +0200
> @@ -1190,8 +1190,9 @@
>     last_frame.set_mdp(new_mdp);
>   JRT_END
> 
> -JRT_ENTRY(MethodCounters*, InterpreterRuntime::build_method_counters(JavaThread* thread, Method* m))
> +JRT_LEAF(MethodCounters*, InterpreterRuntime::build_method_counters(JavaThread* thread, Method* m))
>     MethodCounters* mcs = Method::build_method_counters(m, thread);
> +  TRAPS = thread;

That's a little obscure.

Thread* THREAD = thread;

would be clearer (and consistent with VM_ENTRY macros)

Cheers,
David

>     if (HAS_PENDING_EXCEPTION) {
>       assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOM error here");
>       CLEAR_PENDING_EXCEPTION;
> 
> 
> 
>> -----Original Message-----
>> From: David Holmes <david.holmes at oracle.com>
>> Sent: Mittwoch, 21. August 2019 09:31
>> To: Doerr, Martin <martin.doerr at sap.com>; hotspot-runtime-
>> dev at openjdk.java.net
>> Subject: Re: RFR(T): 8229925: [s390] Exception check missing in interpreter
>>
>> Hi Martin,
>>
>> On 21/08/2019 1:32 am, Doerr, Martin wrote:
>>> Hi,
>>>
>>> we have sporadically seen "assert(!(((ThreadShadow*)__the_thread__)-
>>> has_pending_exception())) failed: Should not have any exceptions
>> pending" on s390 while running jtreg test
>> "vmTestbase/nsk/jvmti/scenarios/capability/CM03/cm03t001".
>>> The VM asserts that no exception is pending after a backedge counter
>> overflow. The unexpected pending exception found in
>> frequency_counter_overflow_inner is an instance of java.lang.ThreadDeath
>> which got installed asynchronously by the test via JVMTI StopThread.
>>> The VM call to InterpreterRuntime::build_method_counters misses an
>> exception check in the s390 implementation. This is necessary for
>> asynchronous exceptions which get installed by this test.
>>>
>>> The explanation may not be trivial, but the proposed fix is:
>>>
>> http://cr.openjdk.java.net/~mdoerr/8229925_s390_exception_check/webre
>> v.00/
>>
>> Seems quite reasonable given the explanation, and comparing similar code
>> to other platforms.
>>
>> PPC64 would seem to have the same bug:
>>
>>     call_VM(noreg, CAST_FROM_FN_PTR(address,
>>
>> InterpreterRuntime::build_method_counters), method, false);
>>
>> Cheers,
>> David
>> -----
>>
>>> Best regards,
>>> Martin
>>>


More information about the hotspot-runtime-dev mailing list