On Tue, 10 Mar 2026 18:34:06 GMT, Markus Grönlund <[email protected]> wrote:

>> JFR Cooperative Sampling relies on a trick to reconstruct a sampled frame at 
>> the method exit poll instruction, because at that location, the frame has 
>> already been popped. The trick takes the frame_size() from the nmethod and 
>> subtracts that value from the SafepointBlob sender frames' sp, thus 
>> recreating the form of the just popped frame.
>> 
>> With Valhalla's new scalarized and non-scalarized frames and calling 
>> conventions, this trick no longer works because the actual frame size is not 
>> kept in the nmethod; instead, it is part of the frame itself, on the stack 
>> (it's the first word below rbp). The problem for JFR Cooperative Sampling is 
>> that, at frame reconstruction time, the SafepointBlob stub will have 
>> overwritten the sp_inc slot of the popped frame, making frame reconstruction 
>> problematic and next to impossible.
>> 
>> [JDK-8368099](https://bugs.openjdk.org/browse/JDK-8368099) provided a 
>> workaround for this problem by skipping all sampled frames with the property 
>> "needs_stack_repair" and moving directly to the sender frame instead. This 
>> results in biased sampling for nearly all samples taken inside frames whose 
>> next poll instruction is the method exit return.
>> 
>> This solution handles both scalarized and non-scalarized frame layouts.
>> 
>> Testing: jdk_valhalla, hotspot_valhalla, hotspot_valhalla_runtime, jdk_jfr, 
>> stress testing
>> 
>> Thanks
>> Markus
>
> Markus Grönlund has updated the pull request incrementally with one 
> additional commit since the last revision:
> 
>   removed unused function

@mgronlun 
Your change (at version 1b7a5319d67bdd66eb29904e65d0751c33f0dfc2) is now ready 
to be sponsored by a Committer.

-------------

PR Comment: https://git.openjdk.org/valhalla/pull/2176#issuecomment-4038077022

Reply via email to