Commit 10bf0a38 authored by Maarten Lankhorst's avatar Maarten Lankhorst

drm/i915: Handle locking better in i915_sink_crc.

Lock the bare minimum, instead of the entire world, and
use interruptible locking because we can.
Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171110113503.16253-6-maarten.lankhorst@linux.intel.comReviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 4493e098
...@@ -2735,39 +2735,63 @@ static int i915_sink_crc(struct seq_file *m, void *data) ...@@ -2735,39 +2735,63 @@ static int i915_sink_crc(struct seq_file *m, void *data)
struct intel_connector *connector; struct intel_connector *connector;
struct drm_connector_list_iter conn_iter; struct drm_connector_list_iter conn_iter;
struct intel_dp *intel_dp = NULL; struct intel_dp *intel_dp = NULL;
struct drm_modeset_acquire_ctx ctx;
int ret; int ret;
u8 crc[6]; u8 crc[6];
drm_modeset_lock_all(dev); drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE);
drm_connector_list_iter_begin(dev, &conn_iter); drm_connector_list_iter_begin(dev, &conn_iter);
for_each_intel_connector_iter(connector, &conn_iter) { for_each_intel_connector_iter(connector, &conn_iter) {
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct drm_connector_state *state;
if (!connector->base.state->best_encoder) if (connector->base.connector_type != DRM_MODE_CONNECTOR_eDP)
continue; continue;
crtc = connector->base.state->crtc; retry:
if (!crtc->state->active) ret = drm_modeset_lock(&dev->mode_config.connection_mutex, &ctx);
if (ret)
goto err;
state = connector->base.state;
if (!state->best_encoder)
continue; continue;
if (connector->base.connector_type != DRM_MODE_CONNECTOR_eDP) crtc = state->crtc;
ret = drm_modeset_lock(&crtc->mutex, &ctx);
if (ret)
goto err;
if (!crtc->state->active)
continue; continue;
intel_dp = enc_to_intel_dp(connector->base.state->best_encoder); intel_dp = enc_to_intel_dp(state->best_encoder);
ret = intel_dp_sink_crc(intel_dp, crc); ret = intel_dp_sink_crc(intel_dp, crc);
if (ret) if (ret)
goto out; goto err;
seq_printf(m, "%02x%02x%02x%02x%02x%02x\n", seq_printf(m, "%02x%02x%02x%02x%02x%02x\n",
crc[0], crc[1], crc[2], crc[0], crc[1], crc[2],
crc[3], crc[4], crc[5]); crc[3], crc[4], crc[5]);
goto out; goto out;
err:
if (ret == -EDEADLK) {
ret = drm_modeset_backoff(&ctx);
if (!ret)
goto retry;
}
goto out;
} }
ret = -ENODEV; ret = -ENODEV;
out: out:
drm_connector_list_iter_end(&conn_iter); drm_connector_list_iter_end(&conn_iter);
drm_modeset_unlock_all(dev); drm_modeset_drop_locks(&ctx);
drm_modeset_acquire_fini(&ctx);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment