Commit b26a6b35 authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Daniel Vetter

drm/i915: Make prepare_plane_fb fully interruptible.

Now that we agreed on not preserving framebuffers pinning is finally
allowed to fail because of signals. Use this to make pinning
and acquire the mutex in an interruptible way too.

Unpinning is still uninterruptible, because it happens as a cleanup
of old state, or undoing pins after one of the pins failed.

The intel_pin_and_fence_fb_obj in page_flip will also wait interruptibly,
and can be aborted now.
Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: default avatarAnder Conselvan de Oliveira <conselvan2@gmail.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 1ee49399
...@@ -2378,11 +2378,10 @@ intel_pin_and_fence_fb_obj(struct drm_plane *plane, ...@@ -2378,11 +2378,10 @@ intel_pin_and_fence_fb_obj(struct drm_plane *plane,
*/ */
intel_runtime_pm_get(dev_priv); intel_runtime_pm_get(dev_priv);
dev_priv->mm.interruptible = false;
ret = i915_gem_object_pin_to_display_plane(obj, alignment, pipelined, ret = i915_gem_object_pin_to_display_plane(obj, alignment, pipelined,
pipelined_request, &view); pipelined_request, &view);
if (ret) if (ret)
goto err_interruptible; goto err_pm;
/* Install a fence for tiled scan-out. Pre-i965 always needs a /* Install a fence for tiled scan-out. Pre-i965 always needs a
* fence, whereas 965+ only requires a fence if using * fence, whereas 965+ only requires a fence if using
...@@ -2406,14 +2405,12 @@ intel_pin_and_fence_fb_obj(struct drm_plane *plane, ...@@ -2406,14 +2405,12 @@ intel_pin_and_fence_fb_obj(struct drm_plane *plane,
i915_gem_object_pin_fence(obj); i915_gem_object_pin_fence(obj);
dev_priv->mm.interruptible = true;
intel_runtime_pm_put(dev_priv); intel_runtime_pm_put(dev_priv);
return 0; return 0;
err_unpin: err_unpin:
i915_gem_object_unpin_from_display_plane(obj, &view); i915_gem_object_unpin_from_display_plane(obj, &view);
err_interruptible: err_pm:
dev_priv->mm.interruptible = true;
intel_runtime_pm_put(dev_priv); intel_runtime_pm_put(dev_priv);
return ret; return ret;
} }
...@@ -13341,7 +13338,9 @@ intel_prepare_plane_fb(struct drm_plane *plane, ...@@ -13341,7 +13338,9 @@ intel_prepare_plane_fb(struct drm_plane *plane,
if (!obj && !old_obj) if (!obj && !old_obj)
return 0; return 0;
mutex_lock(&dev->struct_mutex); ret = i915_mutex_lock_interruptible(dev);
if (ret)
return ret;
if (!obj) { if (!obj) {
ret = 0; ret = 0;
......
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