On Fri, 13 Dec 2024 21:29:53 GMT, Robert Toyonaga <d...@openjdk.org> wrote:

> This is a redo of [JDK-8304824](https://bugs.openjdk.org/browse/JDK-8304824) 
> which was backed out by 
> [JDK-8343726](https://bugs.openjdk.org/browse/JDK-8343726) due to problems 
> documented in [JDK-8343244](https://bugs.openjdk.org/browse/JDK-8343244).
> 
> The problem was that `NmtVirtualMemoryLocker` was not locking when the 
> current thread is not attached by checking `Thread::current_or_null_safe() != 
> nullptr`. This is necessary during VM init, but should not be allowed 
> afterward. NMT may be used in `attach_current_thread` before the current 
> thread is set. The lock was not being acquired in that case, which 
> intermittently caused NMT accounting to become corrupted, triggering various 
> assertions when future NMT operations are done.  To fix this, I've adopted 
> [Thomas' 
> suggestion](https://github.com/openjdk/jdk/pull/21928#issuecomment-2460238057)
>  to reverse the order of 
> 
> 
> thread->register_thread_stack_with_NMT();
> thread->initialize_thread_current();
> 
> 
> in `attach_current_thread`.  This allows `NmtVirtualMemoryLocker` to be 
> locked after current thread is set. 
> 
> To allow for `NmtVirtualMemoryLocker` to be used during VM init, I've 
> replaced the `ConditionalMutexLocker` check `Thread::current_or_null_safe() 
> != nullptr` with a new flag: `_done_bootstrap`. This flag prevents the lock 
> from being used during VM init, at which point we are single threaded anyway. 
> This avoids errors due to Hotspot mutexes and current thread not yet being 
> ready. 
> 
> I also added new asserts in `virtualMemoryTracker.cpp` to catch future bugs 
> like this where the lock is not held when it should be. I updated the 
> appropriate VMT tests to also lock (there were a few cases where locking was 
> being bypassed) so they can pass the new asserts.
> 
> I also removed the unused `_query_lock` variable in `MemTracker`.
> 
> Testing: 
> 
> - On Linux amd64, I was able to consistently reproduce the errors described 
> in [JDK-8343244](https://bugs.openjdk.org/browse/JDK-8343244) by increasing 
> the number of test threads in 
> `java/lang/Thread/jni/AttachCurrentThread/AttachTest.java`. The test 
> consistently passes with the new changes in this PR.
> - hotspot_nmt , gtest:VirtualSpace, tier1

This pull request has now been integrated.

Changeset: 3804082c
Author:    Robert Toyonaga <rtoyo...@redhat.com>
Committer: Thomas Stuefe <stu...@openjdk.org>
URL:       
https://git.openjdk.org/jdk/commit/3804082cba56e6d26c500880cc5cbe6d4332d8f8
Stats:     124 lines in 19 files changed: 75 ins; 28 del; 21 mod

8346123: [REDO] NMT should not use ThreadCritical

Reviewed-by: dholmes, coleenp, stuefe

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

PR: https://git.openjdk.org/jdk/pull/22745

Reply via email to