-
Notifications
You must be signed in to change notification settings - Fork 6.1k
8361103: java_lang_Thread::async_get_stack_trace does not properly protect JavaThread #26119
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
base: master
Are you sure you want to change the base?
Conversation
👋 Welcome back amenkov! A progress list of the required criteria for merging this PR into |
@alexmenkov This change is no longer ready for integration - check the PR body for details. |
@alexmenkov The following label will be automatically applied to this pull request:
When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing list. If you would like to change these labels, use the /label pull request command. |
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.
Generally looks good. A couple of minor nits/queries.
Thanks
thread = java_lang_Thread::thread(carrier_thread); | ||
} else { | ||
thread = java_lang_Thread::thread(java_thread); | ||
java_thread = java_lang_Thread::thread(carrier_thread); |
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.
Won't java_thread
already have been set correctly by cv_internal_thread_to_JavaThread
?
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.
No. This is for virtual thread. We need to get JavaThread from the carrier
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.
Got it.
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.
Actually I think we need a further check here. If we get the carrier thread directly, we have not checked that it is actually protected by the TLH - that is normally done by cv_internal_thread_to_JavaThread
but that doesn't know about virtual threads and carriers! I need to check if we have to fix cv_internal_thread_to_JavaThread
for the virtual thread case.
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.
Well, we don't have TLH protection for carrier (and looks like JVMTI also doesn't care about carrier protection).
I think it may be useful to add virtual thread support to ThreadsListHandle
(and update comments in threadSMR.hpp).
What about:
bool cv_internal_thread_to_JavaThread(jobject jthread, JavaThread ** jt_pp, oop * thread_oop_p);
+ bool cv_oop_to_JavaThread(oop thread_oop, JavaThread** jt_pp);
+ bool cv_thread_or_carrier_to_JavaThread(oop thread_oop, JavaThread** jt_pp, bool* is_virtual_p = nullptr);
Also we need a way to check if specific vthread is mounted to JavaThread (to be checked in handshake), I think it should go to javaThread.hpp/.cpp:
inline bool is_vthread_mounted() const;
+ inline bool is_vthread_mounted(oop vthread) const;
What do you think?
Would be nice to hear @dcubed-ojdk opinion (AFAIK he implemented threadSMR stuff)
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
thread = java_lang_Thread::thread(carrier_thread); | ||
} else { | ||
thread = java_lang_Thread::thread(java_thread); | ||
java_thread = java_lang_Thread::thread(carrier_thread); |
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.
Got it.
@@ -1896,7 +1896,6 @@ oop java_lang_Thread::async_get_stack_trace(jobject jthread, TRAPS) { | |||
java_thread = java_lang_Thread::thread(carrier_thread); | |||
} | |||
if (java_thread == nullptr) { | |||
// terminated platform thread or unmounted virtual thread |
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.
You can leave the // terminated platform thread
comment
I'm also unclear if this code in the handshake is sufficient for dealing with the case where we have a mounted virtual thread initially, but it is unmounted before the handshake gets to execute:
The commented line seems an inaccurate characterization as we could be executing a completely different virtual thread on this carrier now - which is not related to |
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.
Revoking my approval as there may be further issues.
I suppose the comment is obsolete. I don't see |
I suspect it dates back to when there were temporary transitions and where the thread identity had to be temporarily changed to the carrier thread. We've been able to remove that complexity, which eliminates complexity from JVMTI, and maybe here too. |
The fix updates
java_lang_Thread::async_get_stack_trace()
(used byjava.lang.Thread.getStackTrace()
to get stack trace for platform and mounted virtual threads) to correctly useThreadListHandle
for thread protection.Testing: tier1..5
Progress
Issue
Reviewing
Using
git
Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/26119/head:pull/26119
$ git checkout pull/26119
Update a local copy of the PR:
$ git checkout pull/26119
$ git pull https://git.openjdk.org/jdk.git pull/26119/head
Using Skara CLI tools
Checkout this PR locally:
$ git pr checkout 26119
View PR using the GUI difftool:
$ git pr show -t 26119
Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/26119.diff
Using Webrev
Link to Webrev Comment