-
Notifications
You must be signed in to change notification settings - Fork 5.4k
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
8245877: assert(_value != __null) failed: resolving NULL _value in JvmtiExport::post_compiled_method_load #4602
Conversation
👋 Welcome back lmesnik! A progress list of the required criteria for merging this PR into |
@lmesnik this pull request can not be integrated into git checkout 8245877
git fetch https://git.openjdk.java.net/jdk master
git merge FETCH_HEAD
# resolve conflicts and follow the instructions given by git merge
git commit -m "Merge master"
git push |
Webrevs
|
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.
Hi Leonid,
I looks good to me.
Thank you for addressing it!
Thanks,
Serguei
@lmesnik 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 17 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.
Hi Leonid,
I'm not clear on the details here - please see comments below.
Thanks,
David
for (QueueNode* node = _queue_head; node != NULL; node = node->next()) { | ||
node->event().post_compiled_method_load_event(env); | ||
} |
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.
Can't you dequeue() immediately after calling post_compiled_method_load_event()?
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.
Seems that dequeue in for-loop deletes the node which posted. It is possible to update the loop to have update dequeue in the same iteration however, I don't think it is a good idea to mix iterator/deletion in the same loop. What is the reason for this change?
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.
Just to save iterating the queue twice. And that is what the original loop did - you just have to switch the order of processing and deleting.
@@ -1608,6 +1608,7 @@ void nmethod::post_compiled_method_load_event(JvmtiThreadState* state) { | |||
if (is_not_entrant() && can_convert_to_zombie()) { | |||
return; | |||
} | |||
mark_as_seen_on_stack(); |
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.
Not obvious what this actually does in relation to the dequeuing problem.
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.
updated comments
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'm not 100% this is needed because we don't handshake this thread and we just checked that it can't be converted to zombie, but I don't think this hurts anything and I thought it might be needed.
Replied to [@dholmes-ora] comments but don't see any notifications from GitHub yet. Not clear if it is my PR/GitHub/mail issues. |
I see the comment update in the PR and email, but no response to my comment about dequeuing within the for-loop. |
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.
replied to comments
@@ -1608,6 +1608,7 @@ void nmethod::post_compiled_method_load_event(JvmtiThreadState* state) { | |||
if (is_not_entrant() && can_convert_to_zombie()) { | |||
return; | |||
} | |||
mark_as_seen_on_stack(); |
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.
updated comments
[@dholmes-ora] I've updated the loop in the post. Seems your comments were removed because I remove the first loop. |
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!
@@ -1608,6 +1608,7 @@ void nmethod::post_compiled_method_load_event(JvmtiThreadState* state) { | |||
if (is_not_entrant() && can_convert_to_zombie()) { | |||
return; | |||
} | |||
mark_as_seen_on_stack(); |
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'm not 100% this is needed because we don't handshake this thread and we just checked that it can't be converted to zombie, but I don't think this hurts anything and I thought it might be needed.
JvmtiDeferredEvent event = dequeue(); | ||
event.post_compiled_method_load_event(env); | ||
_queue_head->event().post_compiled_method_load_event(env); | ||
dequeue(); |
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.
Good find! So we can zombie the nmethod after we take it off the list. Makes a lot of sense. Thank you for your perseverance in tracking this down!
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!
Thanks,
David
/integrate |
Going to push as commit b969136.
Your commit was automatically rebased without conflicts. |
The crash happens because nmethod might become a zombie before it is enqueued in JvmtiDeferredEventQueue or after it is dequeued from it. The crash is reproduced by serviceability/jvmti/CompiledMethodLoad/Zombie.java. However, it takes ~3K runs to hit it. I verified the fix by running this test >100K on each platform. Also, I verified that protecting in 'void JvmtiDeferredEventQueue::post(JvmtiEnv* env)' is not enough.
Progress
Issue
Reviewers
Reviewing
Using
git
Checkout this PR locally:
$ git fetch https://git.openjdk.java.net/jdk pull/4602/head:pull/4602
$ git checkout pull/4602
Update a local copy of the PR:
$ git checkout pull/4602
$ git pull https://git.openjdk.java.net/jdk pull/4602/head
Using Skara CLI tools
Checkout this PR locally:
$ git pr checkout 4602
View PR using the GUI difftool:
$ git pr show -t 4602
Using diff file
Download this PR as a diff file:
https://git.openjdk.java.net/jdk/pull/4602.diff