[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 13:55:12 UTC 2021
Yes, we are in the process of doing that, but currently a lot of the
reviewers are on vacation :)
Jorn
On 09/07/2021 14:27, Sebastian Stenzel wrote:
> Btw: Any chance this will get backported toJDK-17?
>
>> Am 09.07.2021 um 11:39 schrieb Jorn Vernee <jorn.vernee at oracle.com>:
>>
>>
>>
>> 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