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 <mahap@codeaurora.org>
This commit is contained in:
Mahadevan
2021-04-23 12:28:54 +05:30
committed by Nilaan Gunabalachandran
parent 78b4029179
commit a55a3dfe2a
2 changed files with 11 additions and 10 deletions

View File

@@ -714,6 +714,16 @@ int msm_atomic_commit(struct drm_device *dev,
c->plane_mask |= (1 << drm_plane_index(plane)); 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 * Wait for pending updates on any of the same crtc's and then
* mark our set of crtc's as busy: * mark our set of crtc's as busy:

View File

@@ -1600,7 +1600,7 @@ static void sde_kms_prepare_fence(struct msm_kms *kms,
{ {
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct drm_crtc_state *old_crtc_state; struct drm_crtc_state *old_crtc_state;
int i, rc; int i;
if (!kms || !old_state || !old_state->dev || !old_state->acquire_ctx) { if (!kms || !old_state || !old_state->dev || !old_state->acquire_ctx) {
SDE_ERROR("invalid argument(s)\n"); SDE_ERROR("invalid argument(s)\n");
@@ -1608,15 +1608,6 @@ static void sde_kms_prepare_fence(struct msm_kms *kms,
} }
SDE_ATRACE_BEGIN("sde_kms_prepare_fence"); 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 */ /* old_state actually contains updated crtc pointers */
for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) { for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {