Skip to content

Commit

Permalink
drm/i915/gt: Mark ring->vma as active while pinned
Browse files Browse the repository at this point in the history
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: b1e3177 ("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
  • Loading branch information
Chris Wilson committed Jan 10, 2020
1 parent 1b8bfc5 commit 8ccfc20
Showing 1 changed file with 28 additions and 3 deletions.
31 changes: 28 additions & 3 deletions drivers/gpu/drm/i915/gt/intel_context.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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);
}
Expand All @@ -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;

Expand All @@ -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;
Expand Down

0 comments on commit 8ccfc20

Please sign in to comment.