-
Notifications
You must be signed in to change notification settings - Fork 5.8k
8307106: Allow concurrent GCs to walk CLDG without ClassLoaderDataGraph_lock #13718
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
Conversation
👋 Welcome back eosterlund! A progress list of the required criteria for merging this PR into |
@fisk 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:
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 57 new commits pushed to the
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. ➡️ To integrate this PR with the above commit message to the |
There was a problem hiding this 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 too. Thanks for the preview, Erik.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't see any change here where code stops acquiring the CLDG lock. Is this just a preparatory change?
Using acquire/release etc is certainly necessary to be able to walk the list safely, but it is not obvious it is sufficient. I can't tell when nodes in the CLDG actually get deleted such that the GC thread doing the walking can't access a no longer existing node.
Thanks.
@@ -520,7 +527,8 @@ bool ClassLoaderDataGraph::do_unloading() { | |||
prev->set_next(data); | |||
} else { | |||
assert(dead == _head, "sanity check"); | |||
_head = data; | |||
// The GC might be walking this concurrently | |||
Atomic::store(&_head, data); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you are using load_acquire
then surely this must be a release-store
as they need to be paired.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The load_acquire synchronizes with release_store on insertions. This relaxed unlinking store, doesn't publish anything new that the load_acquire is interested in. It rolls back the head to a CLD that was installed at some earlier point with release_store, meaning it has already been published safely before.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for clarifying
Thanks for having a look, @dholmes-ora.
Yes, indeed. It's for generational ZGC.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the additional explanations @fisk.
Thanks @dholmes-ora! |
/integrate |
Going to push as commit 462b1df.
Your commit was automatically rebased without conflicts. |
A concurrent GC with concurrent class unloading can't currently walk the CLDG without the CLDG_lock today. We should add some synchronization code so it can do that safely. This patch adds the missing bits.
Progress
Issue
Reviewers
Reviewing
Using
git
Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/13718/head:pull/13718
$ git checkout pull/13718
Update a local copy of the PR:
$ git checkout pull/13718
$ git pull https://git.openjdk.org/jdk.git pull/13718/head
Using Skara CLI tools
Checkout this PR locally:
$ git pr checkout 13718
View PR using the GUI difftool:
$ git pr show -t 13718
Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/13718.diff
Webrev
Link to Webrev Comment