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

Sebastian Stenzel sebastian.stenzel at gmail.com
Fri Jul 9 07:58:00 UTC 2021


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> 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 <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