Skip to content

8360775: Fix Shenandoah GC test failures when APX is enabled #26009

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from

Conversation

vamsi-parasa
Copy link
Contributor

@vamsi-parasa vamsi-parasa commented Jun 27, 2025

This PR fixes the test failures seen in many JTreg tests related to Shenandoah GC (test/hotspot/jtreg/gc/shenandoah/) with UseAPX. The issues were root caused to:

  1. Higher band registers are not saved and restored in Shenandoah load_reference_barrier.
  2. Pusha/Popa implementation using push2p/pop2p does not restore the contents of rax.

Both the issues are fixed in this PR.


Progress

  • Change must be properly reviewed (1 review required, with at least 1 Reviewer)
  • Change must not contain extraneous whitespace
  • Commit message must refer to an issue

Issue

  • JDK-8360775: Fix Shenandoah GC test failures when APX is enabled (Bug - P3)

Reviewers

Reviewing

Using git

Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/26009/head:pull/26009
$ git checkout pull/26009

Update a local copy of the PR:
$ git checkout pull/26009
$ git pull https://git.openjdk.org/jdk.git pull/26009/head

Using Skara CLI tools

Checkout this PR locally:
$ git pr checkout 26009

View PR using the GUI difftool:
$ git pr show -t 26009

Using diff file

Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/26009.diff

Using Webrev

Link to Webrev Comment

@vamsi-parasa vamsi-parasa marked this pull request as draft June 27, 2025 00:02
@bridgekeeper
Copy link

bridgekeeper bot commented Jun 27, 2025

👋 Welcome back sparasa! A progress list of the required criteria for merging this PR into master will be added to the body of your pull request. There are additional pull request commands available for use with this pull request.

@openjdk
Copy link

openjdk bot commented Jun 27, 2025

@vamsi-parasa This change now passes all automated pre-integration checks.

ℹ️ This project also has non-automated pre-integration requirements. Please see the file CONTRIBUTING.md for details.

After integration, the commit message for the final commit will be:

8360775: Fix Shenandoah GC test failures when APX is enabled

Reviewed-by: sviswanathan, jbhateja, epeter

You can use pull request commands such as /summary, /contributor and /issue to adjust it as needed.

At the time when this comment was updated there had been 84 new commits pushed to the master branch:

As there are no conflicts, your changes will automatically be rebased on top of these commits when integrating. If you prefer to avoid this automatic rebasing, please check the documentation for the /integrate command for further details.

As you do not have Committer status in this project an existing Committer must agree to sponsor your change. Possible candidates are the reviewers of this PR (@sviswa7, @jatin-bhateja, @eme64) but any other Committer may sponsor as well.

➡️ To flag this PR as ready for integration with the above commit message, type /integrate in a new comment. (Afterwards, your sponsor types /sponsor in a new comment to perform the integration).

@openjdk
Copy link

openjdk bot commented Jun 27, 2025

@vamsi-parasa The following labels will be automatically applied to this pull request:

  • hotspot
  • shenandoah

When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing lists. If you would like to change these labels, use the /label pull request command.

@vamsi-parasa vamsi-parasa marked this pull request as ready for review June 27, 2025 16:29
@openjdk openjdk bot added the rfr Pull request is ready for review label Jun 27, 2025
@mlbridge
Copy link

mlbridge bot commented Jun 27, 2025

Webrevs

@@ -15672,32 +15672,41 @@ void Assembler::pusha() { // 64bit
// The slot for rsp just contains an arbitrary value.
void Assembler::pusha_uncached() { // 64bit
if (UseAPX) {
// Data being pushed by PUSH2 must be 16B-aligned on the stack, for this push rax upfront
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @vamsi-parasa ,

PUSHA / POPA assembler is agnostic to the use of hardcoded registers in calling context, e.g. in following line of code
https://github.com/openjdk/jdk/blob/master/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp#L495

If dst and tmp1 are RAX then we endup currpting it since RAX is used as a scratch register for stack alignment, and in case RAX holds an oop pointer then we may see random crashes. Such idioms are limited to GC barreirs currently, and we have recently fixed one such issue in #25351

While the instruction sequence of PUSHA/ POPA with PPX hints is correct, Do you think for the time being we should limit the scope of this fix to save_machine_state and restor_machine_state routines rather than making generic fix in pusha/popa ?

I have tried it and it's working.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jatin-bhateja Pusha is not expected to change any registers. The inadvertent change of registers is very hard to debug. So in my thoughts it is better to have a conservative implementation currently which doesn't change RAX register.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please see the updated code which fixes the issue by restoring the contents of RAX. The tests are passing with this update.

Copy link
Member

@jatin-bhateja jatin-bhateja Jul 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link

@sviswa7 sviswa7 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me.

@openjdk openjdk bot added the ready Pull request is ready to be integrated label Jul 1, 2025
Copy link
Member

@jatin-bhateja jatin-bhateja left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

Best Regards,
Jatin

Comment on lines +372 to +387
__ movptr(Address(rsp, (--slot) * wordSize), r16);
__ movptr(Address(rsp, (--slot) * wordSize), r17);
__ movptr(Address(rsp, (--slot) * wordSize), r18);
__ movptr(Address(rsp, (--slot) * wordSize), r19);
__ movptr(Address(rsp, (--slot) * wordSize), r20);
__ movptr(Address(rsp, (--slot) * wordSize), r21);
__ movptr(Address(rsp, (--slot) * wordSize), r22);
__ movptr(Address(rsp, (--slot) * wordSize), r23);
__ movptr(Address(rsp, (--slot) * wordSize), r24);
__ movptr(Address(rsp, (--slot) * wordSize), r25);
__ movptr(Address(rsp, (--slot) * wordSize), r26);
__ movptr(Address(rsp, (--slot) * wordSize), r27);
__ movptr(Address(rsp, (--slot) * wordSize), r28);
__ movptr(Address(rsp, (--slot) * wordSize), r29);
__ movptr(Address(rsp, (--slot) * wordSize), r30);
__ movptr(Address(rsp, (--slot) * wordSize), r31);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you should use pushp2 / pop2p for these instructions also , maybe it can be handled along with
#25889

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks Jatin (@jatin-bhateja) for the review and approval! This modification will be pursued in another PR (say #25889).

@vamsi-parasa
Copy link
Contributor Author

Hi Emanuel (@eme64),

This PR is also ready for integration. Would it be possible for you to run the tests?

Thanks,
Vamsi

@eme64
Copy link
Contributor

eme64 commented Jul 2, 2025

Submitted testing for commit 2 / v01 :)

However: I can only test on SSE/AVX machines, so you will have to make sure it runs fine on APX and other architectures that may be impacted.

@vamsi-parasa
Copy link
Contributor Author

Submitted testing for commit 2 / v01 :)

However: I can only test on SSE/AVX machines, so you will have to make sure it runs fine on APX and other architectures that may be impacted.

Thank you, Emanuel!
Yes, this was tested using Intel SDE to emulate the APX features.

@vamsi-parasa
Copy link
Contributor Author

Submitted testing for commit 2 / v01 :)

Hi Emanuel (@eme64),
If the testing has passed, could you pls let me know?

Thanks,
Vamsi

Copy link
Contributor

@eme64 eme64 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Our internal testing passes. Fix looks reasonable. Thanks for the work!

@vamsi-parasa
Copy link
Contributor Author

Our internal testing passes. Fix looks reasonable. Thanks for the work!

Thank you, Emanuel! :)

@vamsi-parasa
Copy link
Contributor Author

/integrate

@openjdk openjdk bot added the sponsor Pull request is ready to be sponsored label Jul 4, 2025
@openjdk
Copy link

openjdk bot commented Jul 4, 2025

@vamsi-parasa
Your change (at version de7c373) is now ready to be sponsored by a Committer.

@sviswa7
Copy link

sviswa7 commented Jul 4, 2025

/sponsor

@openjdk
Copy link

openjdk bot commented Jul 4, 2025

Going to push as commit 1c56072.
Since your change was applied there have been 88 commits pushed to the master branch:

Your commit was automatically rebased without conflicts.

@openjdk openjdk bot added the integrated Pull request has been integrated label Jul 4, 2025
@openjdk openjdk bot closed this Jul 4, 2025
@openjdk openjdk bot removed the ready Pull request is ready to be integrated label Jul 4, 2025
@openjdk openjdk bot removed rfr Pull request is ready for review sponsor Pull request is ready to be sponsored labels Jul 4, 2025
@openjdk
Copy link

openjdk bot commented Jul 4, 2025

@sviswa7 @vamsi-parasa Pushed as commit 1c56072.

💡 You may see a message that your pull request was closed with unmerged commits. This can be safely ignored.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Development

Successfully merging this pull request may close these issues.

4 participants