[Intel-gfx] [PATCH 03/13] drm/i915: Assert the local engine->wakeref is active
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Tue May 7 10:52:00 UTC 2019
On 03/05/2019 12:52, Chris Wilson wrote:
> Due to the asynchronous tasklet and recursive GT wakeref, it may happen
> that we submit to the engine (underneath it's own wakeref) prior to the
> central wakeref being marked as taken. Switch to checking the local wakeref
> for greater consistency.
>
> Fixes: 79ffac8599c4 ("drm/i915: Invert the GEM wakeref hierarchy")
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
> drivers/gpu/drm/i915/gt/intel_engine_cs.c | 3 +++
> drivers/gpu/drm/i915/gt/intel_lrc.c | 4 ++--
> 2 files changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> index 5907a9613641..416d7e2e6f8c 100644
> --- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> +++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> @@ -1090,6 +1090,9 @@ bool intel_engine_is_idle(struct intel_engine_cs *engine)
> if (i915_reset_failed(engine->i915))
> return true;
>
> + if (!intel_wakeref_active(&engine->wakeref))
> + return true;
> +
> /* Waiting to drain ELSP? */
> if (READ_ONCE(engine->execlists.active)) {
> struct tasklet_struct *t = &engine->execlists.tasklet;
> diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
> index 7d69d07490e8..5580b6f1aa0c 100644
> --- a/drivers/gpu/drm/i915/gt/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
> @@ -535,7 +535,7 @@ static void execlists_submit_ports(struct intel_engine_cs *engine)
> * that all ELSP are drained i.e. we have processed the CSB,
> * before allowing ourselves to idle and calling intel_runtime_pm_put().
> */
> - GEM_BUG_ON(!engine->i915->gt.awake);
> + GEM_BUG_ON(!intel_wakeref_active(&engine->wakeref));
>
> /*
> * ELSQ note: the submit queue is not cleared after being submitted
> @@ -1085,7 +1085,7 @@ static void execlists_submission_tasklet(unsigned long data)
>
> GEM_TRACE("%s awake?=%d, active=%x\n",
> engine->name,
> - !!engine->i915->gt.awake,
> + !!intel_wakeref_active(&engine->wakeref),
> engine->execlists.active);
>
> spin_lock_irqsave(&engine->timeline.lock, flags);
>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Regards,
Tvrtko
More information about the Intel-gfx
mailing list