From 94f831f4cf9a5f5ffbee07d3a8584faf1435a89a Mon Sep 17 00:00:00 2001 From: Mahadevan Date: Fri, 23 Apr 2021 12:28:54 +0530 Subject: [PATCH] disp: msm: avoid deadlock by prepending connection_mutex Commit caused by dpms on may use extra modeset lock on connection_mutex before msm_atomic_commit, so to avoid deadlock, make the modeset lock within msm_atomic_commit to be used before the waiting for pending_crtcs_event. Change-Id: Ic43af0f775d87ccc1d145ead9cb2e1b65018c86f Signed-off-by: Mahadevan --- msm/msm_atomic.c | 12 +++++++++++- msm/sde/sde_kms.c | 11 +---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/msm/msm_atomic.c b/msm/msm_atomic.c index 6bddb33d9824..953fd3b174e1 100644 --- a/msm/msm_atomic.c +++ b/msm/msm_atomic.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. * Copyright (C) 2014 Red Hat * Author: Rob Clark * @@ -689,6 +689,16 @@ int msm_atomic_commit(struct drm_device *dev, c->plane_mask |= (1 << drm_plane_index(plane)); } + /* Protection for prepare_fence callback */ +retry: + ret = drm_modeset_lock(&state->dev->mode_config.connection_mutex, + state->acquire_ctx); + + if (ret == -EDEADLK) { + drm_modeset_backoff(state->acquire_ctx); + goto retry; + } + /* * Wait for pending updates on any of the same crtc's and then * mark our set of crtc's as busy: diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index 0b36b0b2d0e7..78bcf7aed5be 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -1589,7 +1589,7 @@ static void sde_kms_prepare_fence(struct msm_kms *kms, { struct drm_crtc *crtc; struct drm_crtc_state *old_crtc_state; - int i, rc; + int i; if (!kms || !old_state || !old_state->dev || !old_state->acquire_ctx) { SDE_ERROR("invalid argument(s)\n"); @@ -1597,15 +1597,6 @@ static void sde_kms_prepare_fence(struct msm_kms *kms, } SDE_ATRACE_BEGIN("sde_kms_prepare_fence"); -retry: - /* attempt to acquire ww mutex for connection */ - rc = drm_modeset_lock(&old_state->dev->mode_config.connection_mutex, - old_state->acquire_ctx); - - if (rc == -EDEADLK) { - drm_modeset_backoff(old_state->acquire_ctx); - goto retry; - } /* old_state actually contains updated crtc pointers */ for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {