[Intel-gfx] [PATCH] drm/i915: Keep rings pinned while the context is active
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Wed Jun 19 14:35:41 UTC 2019
On 19/06/2019 14:44, Chris Wilson wrote:
> Remember to keep the rings pinned as well as the context image until the
> GPU is no longer active.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110946
> Fixes: ce476c80b8bf ("drm/i915: Keep contexts pinned until after the next kernel context switch")
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
> drivers/gpu/drm/i915/gt/intel_context.c | 17 ++++++++++++-----
> drivers/gpu/drm/i915/gt/intel_lrc.c | 9 +--------
> 2 files changed, 13 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_context.c b/drivers/gpu/drm/i915/gt/intel_context.c
> index 2c454f227c2e..b84f11a52d88 100644
> --- a/drivers/gpu/drm/i915/gt/intel_context.c
> +++ b/drivers/gpu/drm/i915/gt/intel_context.c
> @@ -126,6 +126,7 @@ static void intel_context_retire(struct i915_active *active)
> if (ce->state)
> __context_unpin_state(ce->state);
>
> + intel_ring_unpin(ce->ring);
> intel_context_put(ce);
> }
>
> @@ -160,15 +161,16 @@ int intel_context_active_acquire(struct intel_context *ce, unsigned long flags)
>
> intel_context_get(ce);
>
> + err = intel_ring_pin(ce->ring);
> + if (err)
> + goto err_put;
> +
> if (!ce->state)
> return 0;
>
> err = __context_pin_state(ce->state, flags);
> - if (err) {
> - i915_active_cancel(&ce->active);
> - intel_context_put(ce);
> - return err;
> - }
> + if (err)
> + goto err_put;
intel_ring_unpin?
Regards,
Tvrtko
>
> /* Preallocate tracking nodes */
> if (!i915_gem_context_is_kernel(ce->gem_context)) {
> @@ -181,6 +183,11 @@ int intel_context_active_acquire(struct intel_context *ce, unsigned long flags)
> }
>
> return 0;
> +
> +err_put:
> + intel_context_put(ce);
> + i915_active_cancel(&ce->active);
> + return err;
> }
>
> void intel_context_active_release(struct intel_context *ce)
> diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
> index b42b5f158295..4bfb819386ea 100644
> --- a/drivers/gpu/drm/i915/gt/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
> @@ -1426,7 +1426,6 @@ static void execlists_context_unpin(struct intel_context *ce)
> {
> i915_gem_context_unpin_hw_id(ce->gem_context);
> i915_gem_object_unpin_map(ce->state->obj);
> - intel_ring_unpin(ce->ring);
> }
>
> static void
> @@ -1478,13 +1477,9 @@ __execlists_context_pin(struct intel_context *ce,
> goto unpin_active;
> }
>
> - ret = intel_ring_pin(ce->ring);
> - if (ret)
> - goto unpin_map;
> -
> ret = i915_gem_context_pin_hw_id(ce->gem_context);
> if (ret)
> - goto unpin_ring;
> + goto unpin_map;
>
> ce->lrc_desc = lrc_descriptor(ce, engine);
> ce->lrc_reg_state = vaddr + LRC_STATE_PN * PAGE_SIZE;
> @@ -1492,8 +1487,6 @@ __execlists_context_pin(struct intel_context *ce,
>
> return 0;
>
> -unpin_ring:
> - intel_ring_unpin(ce->ring);
> unpin_map:
> i915_gem_object_unpin_map(ce->state->obj);
> unpin_active:
>
More information about the Intel-gfx
mailing list