From 6e11e049e9150d7eeb8acfe0b8c58ebd4692ddf6 Mon Sep 17 00:00:00 2001 From: "jorgegil@google.com" Date: Wed, 13 Oct 2021 14:20:14 -0700 Subject: [PATCH] Dump DisplayModeDirector state without locking mSyncRoot The current locking order of DisplayManagerGlobal.mLock, DisplayManagerService.mSyncRoot and SensorObserver.mSensorObserverLock may cause a deadlock when an EVENT_DISPLAY_CHANGED event is handled by MediaRouter.Static and DMD.SensorObserver at the same time as a DisplayManagerService dump is in progress. The locking order of onDisplayChanged is: - mSensorObserverLock -> DMG.mLock -> DMS.mSyncRoot The locking order of DMS.dumpInternal is: - DMS.mSyncRoot -> mSensorOberverLock This change removes the mSyncRoot locking during the DMD dump to keep the lock ordering from going in a cycle. DMD already guards its state during a dump with its own class lock, so holding mSyncRoot is not really necessary. Bug: 202515175 Test: builds Change-Id: I464e570e7107b49633e599b25ef1d208c9fc76aa --- .../com/android/server/display/DisplayManagerService.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index f16ed41af5caa..a3b5e79cc8c7f 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -2062,9 +2062,6 @@ public final class DisplayManagerService extends SystemService { pw.println(); mLogicalDisplayMapper.dumpLocked(pw); - pw.println(); - mDisplayModeDirector.dump(pw); - final int callbackCount = mCallbacks.size(); pw.println(); pw.println("Callbacks: size=" + callbackCount); @@ -2087,6 +2084,8 @@ public final class DisplayManagerService extends SystemService { pw.println(); mPersistentDataStore.dump(pw); } + pw.println(); + mDisplayModeDirector.dump(pw); } private static float[] getFloatArray(TypedArray array) {