On Tue, 22 Feb 2022 22:05:21 GMT, Zhengyu Gu <z...@openjdk.org> wrote:
>> There are scenarios that JDWP agent can deadlock on `classTrackLock` >> monitor. Following is the scenario in bug report. >> >> **Java Thread** >> - loads a class and post `JVMTI_EVENT_CLASS_PREPARE` event >> - JDWP event callback handler calls `classTrack_processUnloads()` to handle >> the event. >> - `classTrack_processUnloads()` takes `classTrackLock` lock, then tries to >> allocate a new bag under the lock. >> - bag allocation code calls` jvmtiAllocate()`, which may be blocked by >> ongoing safepoint due to state transition. >> >> If the safepoint is GC safepoint (prior to JDK16) or >> `VM_JvmtiPostObjectFree` safepoint (JDK16 or later) >> >> **VM Thread** >> - post `JVMTI_EVENT_OBJECT_FREE` >> - JDWP event callback handler calls `cbTrackingObjectFree()` to handle the >> event >> - `cbTrackingObjectFree()` tries to acquire `classTrackLock` lock, leads to >> deadlock >> >> From my research, there are three events that may be posted at safepoints, >> `JVMTI_EVENT_GARBAGE_COLLECTION_START`, >> `JVMTI_EVENT_GARBAGE_COLLECTION_FINISH` and `JVMTI_EVENT_OBJECT_FREE`, but >> only `JVMTI_EVENT_OBJECT_FREE` is relevant to JDWP agent. >> >> The solution I purpose here, is simply move allocation/deallocation code >> outside of `classTrackLock` lock. >> >> >> Test: >> - [x] tier1 >> - [x] vmTestbase_nsk_jdi >> - [x] vmTestbase_nsk_jdwp >> - [x] vmTestbase_nsk_jvmti > > Zhengyu Gu has updated the pull request incrementally with one additional > commit since the last revision: > > Missing space > I thought from: > [#7461 > (comment)](https://github.com/openjdk/jdk/pull/7461#issuecomment-1043215122) > there was srtill an outstanding issue with the handlerLock ? Though > @plummercj seems to have approved anyway. That's was just part of the discussion as to how much locking is really needed, and we agreed not to address those issues in this PR. So the code is (and already was) probably over synchronized, but that's ok and maybe we can address it at a later point. ------------- PR: https://git.openjdk.java.net/jdk/pull/7461