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
This commit is contained in:
parent
ceccad5910
commit
0cd1262de7
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user