[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