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:

committed by
Nilaan Gunabalachandran

parent
78b4029179
commit
a55a3dfe2a
@@ -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:
|
||||||
|
@@ -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) {
|
||||||
|
Reference in New Issue
Block a user