summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Adrian Salido <salidoa@google.com> 2022-02-17 19:22:31 -0800
committer Adrian Salido <salidoa@google.com> 2022-03-04 22:30:15 +0000
commita942af8a8f7774de0f090525d90c97ba50f3cc0e (patch)
treecf83e346908d1e39760ee214ac710af5d39cc36a
parent57b91217ff8cda372dbce11093a2276f1ca39a25 (diff)
SF: fix deadlock while switching resolution
Trying to grab mStateLock during kernelTimerChanged could lead to deadlock when changing resolution as display gets recreated and the idle timer may get stopped/re-started. The deadlock could happen when calling OneShotTimer::stop() (due to thread join) in main thread while kernelTimerChanged is waiting for lock. Bug: 222755257 Test: cmd display set-user-preferred-display-mode Change-Id: I0ccc7bccdcee98722c1dced09032ab3953d851cb
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index e8034de52c..350d7096aa 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -6063,7 +6063,6 @@ void SurfaceFlinger::kernelTimerChanged(bool expired) {
static bool updateOverlay =
property_get_bool("debug.sf.kernel_idle_timer_update_overlay", true);
if (!updateOverlay) return;
- if (Mutex::Autolock lock(mStateLock); !isRefreshRateOverlayEnabled()) return;
// Update the overlay on the main thread to avoid race conditions with
// mRefreshRateConfigs->getCurrentRefreshRate()
@@ -6073,6 +6072,7 @@ void SurfaceFlinger::kernelTimerChanged(bool expired) {
ALOGW("%s: default display is null", __func__);
return;
}
+ if (!display->isRefreshRateOverlayEnabled()) return;
const auto desiredActiveMode = display->getDesiredActiveMode();
const std::optional<DisplayModeId> desiredModeId = desiredActiveMode