aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVille Syrjälä2014-06-18 22:04:48 +0300
committerDaniel Vetter2014-07-07 17:21:56 +0200
commit4bfad3ddc8cfcd9938c8e4b0b5b73780d4726438 (patch)
tree84e1ced842d9e172cb9854ec1f9cd133156d59d4
parent13cf550448b58abf8f44f5d6a560f2d20871c965 (diff)
drm/i915: Unpin last_context at reset
We're forgetting to unpin the last_context from the ggtt at GPU reset time. This leads to the vma pin_count leaking at every reset if the last context wasn't the ring default context. Further use of the same context will trigger the pin_count check in i915_gem_object_pin() and userspace will be faced with EBUSY as a result. This plaques kms_flip rather badly since it performs lots of resets, and every fd has its own default context these days. Fix the problem by properly unpinning the last context at reset. This regression seems to back to commit acce9ffa4807027965ebd948456fa8385bbee32e Author: Ben Widawsky <ben@bwidawsk.net> Date: Fri Dec 6 14:11:03 2013 -0800 drm/i915: Better reset handling for contexts Testcase: igt/gem_ctx_exec/reset-pin-leak Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_gem_context.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 0d2c75bde96e..06561213cf29 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -382,6 +382,9 @@ void i915_gem_context_reset(struct drm_device *dev)
dctx->obj->active = 0;
}
+ if (ring->last_context->obj && i == RCS)
+ i915_gem_object_ggtt_unpin(ring->last_context->obj);
+
i915_gem_context_unreference(ring->last_context);
i915_gem_context_reference(dctx);
ring->last_context = dctx;