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: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Fixes: b1e3177bd1
("drm/i915: Coordinate i915_active with its own mutex")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Acked-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200110110402.1231745-3-chris@chris-wilson.co.uk
This commit is contained in:
parent
1b8bfc5726
commit
8ccfc20a7d
|
@ -185,6 +185,31 @@ static void __context_unpin_state(struct i915_vma *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
|
||||
static void __intel_context_retire(struct i915_active *active)
|
||||
{
|
||||
|
@ -197,7 +222,7 @@ static void __intel_context_retire(struct i915_active *active)
|
|||
__context_unpin_state(ce->state);
|
||||
|
||||
intel_timeline_unpin(ce->timeline);
|
||||
intel_ring_unpin(ce->ring);
|
||||
__ring_retire(ce->ring);
|
||||
|
||||
intel_context_put(ce);
|
||||
}
|
||||
|
@ -211,7 +236,7 @@ static int __intel_context_active(struct i915_active *active)
|
|||
|
||||
intel_context_get(ce);
|
||||
|
||||
err = intel_ring_pin(ce->ring);
|
||||
err = __ring_active(ce->ring);
|
||||
if (err)
|
||||
goto err_put;
|
||||
|
||||
|
@ -231,7 +256,7 @@ static int __intel_context_active(struct i915_active *active)
|
|||
err_timeline:
|
||||
intel_timeline_unpin(ce->timeline);
|
||||
err_ring:
|
||||
intel_ring_unpin(ce->ring);
|
||||
__ring_retire(ce->ring);
|
||||
err_put:
|
||||
intel_context_put(ce);
|
||||
return err;
|
||||
|
|
Loading…
Reference in New Issue