Commit dce54e86 authored by Chris Wilson's avatar Chris Wilson Committed by Joonas Lahtinen

drm/i915/gt: Mark ring->vma as active while pinned

As we use the active state to keep the vma alive while we are reading
its contents during GPU error capture, we need to mark the
ring->vma as active during execution if we want to include the rinbuffer
in the error state.
Reported-by: default avatarLionel Landwerlin <lionel.g.landwerlin@intel.com>
Fixes: b1e3177b ("drm/i915: Coordinate i915_active with its own mutex")
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Acked-by: default avatarLionel Landwerlin <lionel.g.landwerlin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200110110402.1231745-3-chris@chris-wilson.co.uk
(cherry picked from commit 8ccfc20a)
Signed-off-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
parent e2c56d89
...@@ -148,6 +148,31 @@ static void __context_unpin_state(struct i915_vma *vma) ...@@ -148,6 +148,31 @@ static void __context_unpin_state(struct i915_vma *vma)
__i915_vma_unpin(vma); __i915_vma_unpin(vma);
} }
static int __ring_active(struct intel_ring *ring)
{
int err;
err = i915_active_acquire(&ring->vma->active);
if (err)
return err;
err = intel_ring_pin(ring);
if (err)
goto err_active;
return 0;
err_active:
i915_active_release(&ring->vma->active);
return err;
}
static void __ring_retire(struct intel_ring *ring)
{
intel_ring_unpin(ring);
i915_active_release(&ring->vma->active);
}
__i915_active_call __i915_active_call
static void __intel_context_retire(struct i915_active *active) static void __intel_context_retire(struct i915_active *active)
{ {
...@@ -160,7 +185,7 @@ static void __intel_context_retire(struct i915_active *active) ...@@ -160,7 +185,7 @@ static void __intel_context_retire(struct i915_active *active)
__context_unpin_state(ce->state); __context_unpin_state(ce->state);
intel_timeline_unpin(ce->timeline); intel_timeline_unpin(ce->timeline);
intel_ring_unpin(ce->ring); __ring_retire(ce->ring);
intel_context_put(ce); intel_context_put(ce);
} }
...@@ -172,7 +197,7 @@ static int __intel_context_active(struct i915_active *active) ...@@ -172,7 +197,7 @@ static int __intel_context_active(struct i915_active *active)
intel_context_get(ce); intel_context_get(ce);
err = intel_ring_pin(ce->ring); err = __ring_active(ce->ring);
if (err) if (err)
goto err_put; goto err_put;
...@@ -192,7 +217,7 @@ static int __intel_context_active(struct i915_active *active) ...@@ -192,7 +217,7 @@ static int __intel_context_active(struct i915_active *active)
err_timeline: err_timeline:
intel_timeline_unpin(ce->timeline); intel_timeline_unpin(ce->timeline);
err_ring: err_ring:
intel_ring_unpin(ce->ring); __ring_retire(ce->ring);
err_put: err_put:
intel_context_put(ce); intel_context_put(ce);
return err; return err;
......
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