[External] : Re: [foreign-memaccess+abi] Integrated: 8268673: Stack walk across optimized entry frame on fresh native thread fails

Jorn Vernee jorn.vernee at oracle.com
Fri Jul 9 09:38:19 UTC 2021


Great!

Thanks for testing,
Jorn

On 09/07/2021 09:58, Sebastian Stenzel wrote:
> Hi Jorn,
>
> yes, I can confirm this fixes the issue.
>
> I tested on foreign-jextract, where the issue was still present 
> on 6f8f9e28c54 and fixed on 42e03fd7c6a.
>
> Cheers!
> Sebastian
>
>> On 8. Jul 2021, at 17:05, Jorn Vernee <jorn.vernee at oracle.com 
>> <mailto:jorn.vernee at oracle.com>> wrote:
>>
>> Hi Sebastian,
>>
>> I was not able to reproduce your specific problem, but I did find 
>> another problem with USE_INTRINSICS=true that seems to be a likely 
>> cause of what you were seeing. Namely: when an upcall happens on a 
>> separate native thread, the return value of the upcall was being 
>> corrupted when detaching the thread from the JVM again. So, it might 
>> be the case that the problem you were seeing was from an upcall 
>> returning an incorrect result. (I did rule out that it's a problem 
>> with the way arguments are passed).
>>
>> I've just integrated a patch that fixes the issue: 
>> https://github.com/openjdk/panama-foreign/pull/565
>>
>> If you have an opportunity to test out the fix, that would be greatly 
>> appreciated.
>>
>> Thanks,
>> Jorn
>>
>> On 15/06/2021 17:46, Jorn Vernee wrote:
>>>
>>> Ok thanks,
>>>
>>> If upcalls are involved it makes sense then that the 
>>> ProgrammableUpcallHandler.USE_INTRINSICS has an effect. Both 
>>> invocation modes should behave the same, but the implementations are 
>>> completely separate, so if setting the flag to false makes a 
>>> difference there might be a problem when passing one of the 
>>> arguments when USE_INTRINSICS=true.
>>>
>>> Thanks for testing, I'll try and reproduce the issue here as well.
>>>
>>> Jorn
>>>
>>> On 15/06/2021 17:10, Sebastian Stenzel wrote:
>>>> A reference to the first mentioned method is stored in a struct [1] 
>>>> (defined in fuse_operations.h) right here [2], which then gets 
>>>> passed to FUSE. FUSE then decides to call some of these methods 
>>>> when a corresponding file system access happens.
>>>>
>>>> [1]: 
>>>> https://github.com/skymatic/fuse-panama/blob/3e5dc43ec7a6ba7e2c39fcce0db48d4350fdc0b3/src/main/java/de/skymatic/fusepanama/lowlevel/fuse_operations.java#L28 
>>>> <https://urldefense.com/v3/__https://github.com/skymatic/fuse-panama/blob/3e5dc43ec7a6ba7e2c39fcce0db48d4350fdc0b3/src/main/java/de/skymatic/fusepanama/lowlevel/fuse_operations.java*L28__;Iw!!GqivPVa7Brio!IACTB0TzhBi09Zn2FRLC-Lkt6VqU7CWFBtZDudXO2BDhgk1TYYFrljCX5TIPESgu$>
>>>> [2]: 
>>>> https://github.com/skymatic/fuse-panama/blob/3e5dc43ec7a6ba7e2c39fcce0db48d4350fdc0b3/src/main/java/de/skymatic/fusepanama/FuseOperations.java#L25 
>>>> <https://urldefense.com/v3/__https://github.com/skymatic/fuse-panama/blob/3e5dc43ec7a6ba7e2c39fcce0db48d4350fdc0b3/src/main/java/de/skymatic/fusepanama/FuseOperations.java*L25__;Iw!!GqivPVa7Brio!IACTB0TzhBi09Zn2FRLC-Lkt6VqU7CWFBtZDudXO2BDhgk1TYYFrljCX5f8dc5As$>
>>>>
>>>>
>>>>> On 15. Jun 2021, at 16:52, Jorn Vernee <jorn.vernee at oracle.com 
>>>>> <mailto:jorn.vernee at oracle.com>> wrote:
>>>>>
>>>>> Hi Sebastian,
>>>>>
>>>>> This sounds very odd, as the code you link to doesn't seem to use 
>>>>> upcalls? The ProgrammableUpcallHandler.USE_INTRINSICS flag is only 
>>>>> used to control the invocation mode of upcalls.
>>>>>
>>>>> May I ask how exactly you're diagnosing this problem?
>>>>>
>>>>> Jorn
>>>>>
>>>>> On 15/06/2021 15:48, Sebastian Stenzel wrote:
>>>>>> Hi,
>>>>>>
>>>>>> I have pulled this fix (foreign-jextract commit e4f89d7b0f8) and 
>>>>>> can confirm that the crashes are gone. However, copying bytes 
>>>>>> from heap to native buffers still is a little odd. Take this 
>>>>>> code: [1]; [2]
>>>>>>
>>>>>> If I run the project with 
>>>>>> `-Djdk.internal.foreign.ProgrammableUpcallHandler.USE_INTRINSICS=false`, 
>>>>>> it copies the contents of HELLO_STR to the segment. Without the 
>>>>>> flag it copies 13 null-bytes, though. 13 being the correct length 
>>>>>> of the source buffer.
>>>>>>
>>>>>> I guess this is not related to the stack walking problem. The 
>>>>>> only thing I can tell is that said flag has some influence on the 
>>>>>> behaviour.
>>>>>>
>>>>>> Cheers!
>>>>>> Sebastian
>>>>>>
>>>>>>
>>>>>> [1] my upcall method: 
>>>>>> https://github.com/skymatic/fuse-panama/blob/3e5dc43ec7a6ba7e2c39fcce0db48d4350fdc0b3/src/main/java/de/skymatic/fusepanama/FuseOperations.java#L222-L227 
>>>>>> <https://urldefense.com/v3/__https://github.com/skymatic/fuse-panama/blob/3e5dc43ec7a6ba7e2c39fcce0db48d4350fdc0b3/src/main/java/de/skymatic/fusepanama/FuseOperations.java*L222-L227__;Iw!!GqivPVa7Brio!IACTB0TzhBi09Zn2FRLC-Lkt6VqU7CWFBtZDudXO2BDhgk1TYYFrljCX5SMpro9I$>
>>>>>> [2] method invoked during upcall, which copies bytes to the 
>>>>>> specified segment: 
>>>>>> https://github.com/skymatic/fuse-panama/blob/3e5dc43ec7a6ba7e2c39fcce0db48d4350fdc0b3/src/test/java/de/skymatic/fusepanama/examples/HelloPanamaFileSystem.java#L109-L112 
>>>>>> <https://urldefense.com/v3/__https://github.com/skymatic/fuse-panama/blob/3e5dc43ec7a6ba7e2c39fcce0db48d4350fdc0b3/src/test/java/de/skymatic/fusepanama/examples/HelloPanamaFileSystem.java*L109-L112__;Iw!!GqivPVa7Brio!IACTB0TzhBi09Zn2FRLC-Lkt6VqU7CWFBtZDudXO2BDhgk1TYYFrljCX5ZFCsni2$>
>>>>>>
>>>>>>
>>>>>>> On 14. Jun 2021, at 17:09, Jorn Vernee <jvernee at openjdk.java.net 
>>>>>>> <mailto:jvernee at openjdk.java.net>> wrote:
>>>>>>>
>>>>>>> On Mon, 14 Jun 2021 12:13:52 GMT, Jorn Vernee 
>>>>>>> <jvernee at openjdk.org <mailto:jvernee at openjdk.org>> wrote:
>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> When native code creates a new thread and calls a Panama 
>>>>>>>> upcall, and during that upcall a stack walk is triggered, 
>>>>>>>> getting the sender frame for the entry frame is not possible, 
>>>>>>>> and should not be attempted.
>>>>>>>>
>>>>>>>> For JNI this case is handled already by indicating the end of 
>>>>>>>> the stack frame stream, but for Panama upcalls it is not, and 
>>>>>>>> the VM will either hit an assert or crash when trying to find 
>>>>>>>> the last Java frame before the entry frame (which does not 
>>>>>>>> exist in this case).
>>>>>>>>
>>>>>>>> This patch adds handling for panama upcalls frames to 
>>>>>>>> `frame::is_first_frame`, which is used by the stack walking 
>>>>>>>> code to determine when to stop walking.
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Jorn
>>>>>>>
>>>>>>> This pull request has now been integrated.
>>>>>>>
>>>>>>> Changeset: 2287ca5a
>>>>>>> Author:    Jorn Vernee <jvernee at openjdk.org 
>>>>>>> <mailto:jvernee at openjdk.org>>
>>>>>>> URL: 
>>>>>>> https://git.openjdk.java.net/panama-foreign/commit/2287ca5a530c348bc4ec7c0c6774e8ed9101dffa 
>>>>>>> <https://git.openjdk.java.net/panama-foreign/commit/2287ca5a530c348bc4ec7c0c6774e8ed9101dffa>
>>>>>>> Stats:     194 lines in 11 files changed: 193 ins; 0 del; 1 mod
>>>>>>>
>>>>>>> 8268673: Stack walk across optimized entry frame on fresh native 
>>>>>>> thread fails
>>>>>>>
>>>>>>> Reviewed-by: mcimadamore
>>>>>>>
>>>>>>> -------------
>>>>>>>
>>>>>>> PR: https://git.openjdk.java.net/panama-foreign/pull/558 
>>>>>>> <https://git.openjdk.java.net/panama-foreign/pull/558>
>>>>>>
>>>>
>


More information about the panama-dev mailing list