summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_display.c
diff options
context:
space:
mode:
authorMatt Roper2016-01-12 16:13:37 +0100
committerMatt Roper2016-01-12 19:11:16 +0100
commit0cd1262de7b7509bbbcd650a9918e8895dee6d73 (patch)
tree880ad8a08c2a2e8255d577e7161932664ac733a9 /drivers/gpu/drm/i915/intel_display.c
parentdrm/i915: Only complain about n_edp_entries with eDP ports (diff)
downloadkernel-qcow2-linux-0cd1262de7b7509bbbcd650a9918e8895dee6d73.tar.gz
kernel-qcow2-linux-0cd1262de7b7509bbbcd650a9918e8895dee6d73.tar.xz
kernel-qcow2-linux-0cd1262de7b7509bbbcd650a9918e8895dee6d73.zip
drm/i915: Handle error paths during watermark sanitization properly (v3)
sanitize_watermarks() does not properly handle errors returned by drm_atomic_helper_duplicate_state(). Make failures drop locks before returning. We also change the lock of connection_mutex to a drm_modeset_lock_all_ctx() to make sure any EDEADLK's are handled earlier. v2: Change call to lock connetion_mutex with a call to drm_modeset_lock_all_ctx(). This ensures that any lock contention is handled earlier and drm_atomic_helper_duplicate_state() won't return EDEADLK. (Maarten) v3: Drop locks properly in more error paths. (Maarten) Cc: Daniel Vetter <daniel@ffwll.ch> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Signed-off-by: Matt Roper <matthew.d.roper@intel.com> Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1452611617-32144-1-git-send-email-matthew.d.roper@intel.com
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 9c87d5784f1a..3b79981735c8 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -15355,17 +15355,17 @@ static void sanitize_watermarks(struct drm_device *dev)
*/
drm_modeset_acquire_init(&ctx, 0);
retry:
- ret = drm_modeset_lock(&dev->mode_config.connection_mutex, &ctx);
+ ret = drm_modeset_lock_all_ctx(dev, &ctx);
if (ret == -EDEADLK) {
drm_modeset_backoff(&ctx);
goto retry;
} else if (WARN_ON(ret)) {
- return;
+ goto fail;
}
state = drm_atomic_helper_duplicate_state(dev, &ctx);
if (WARN_ON(IS_ERR(state)))
- return;
+ goto fail;
/*
* Hardware readout is the only time we don't want to calculate
@@ -15388,7 +15388,7 @@ retry:
* BIOS-programmed watermarks untouched and hope for the best.
*/
WARN(true, "Could not determine valid watermarks for inherited state\n");
- return;
+ goto fail;
}
/* Write calculated watermark values back */
@@ -15401,6 +15401,7 @@ retry:
}
drm_atomic_state_free(state);
+fail:
drm_modeset_drop_locks(&ctx);
drm_modeset_acquire_fini(&ctx);
}