[Intel-gfx] [PATCH 1/3] drm/i915: Always sanity check engine state upon idling

Mika Kuoppala mika.kuoppala at linux.intel.com
Tue Aug 29 13:36:57 UTC 2017


Chris Wilson <chris at chris-wilson.co.uk> writes:

> When we do a locked idle we know that afterwards all requests have been
> completed and the engines have been cleared of tasks. For whatever
> reason, this doesn't always happen and we may go into a suspend with
> ELSP still full, and this causes an issue upon resume as we get very,
> very confused.
>
> If the engines refuse to idle, mark the device as wedged. In the process
> we get rid of the maybe unused open-coded version of wait_for_engines
> reported by Nick Desaulniers and Matthias Kaehlcke.
>
> References: https://bugs.freedesktop.org/show_bug.cgi?id=101891
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> Cc: Matthias Kaehlcke <mka at chromium.org>

I noticed that when actually do switch to kernel context, it's
async. And then we always do wait for idle.

So as all our usage is sync, why don't we just wait the req in
i915_gem_switch_to_kernel_context(i915) to pinpoint the request
uncompletion. And in addition have this as a further harderning.

But for the unconditional wedge and warn,

Reviewed-by: Mika Kuoppala <mika.kuoppala at intel.com>

-Mika


> ---
>  drivers/gpu/drm/i915/i915_gem.c | 20 ++++----------------
>  1 file changed, 4 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index ac02785fdaff..c1520c0d2084 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -3371,24 +3371,12 @@ static int wait_for_timeline(struct i915_gem_timeline *tl, unsigned int flags)
>  	return 0;
>  }
>  
> -static int wait_for_engine(struct intel_engine_cs *engine, int timeout_ms)
> -{
> -	return wait_for(intel_engine_is_idle(engine), timeout_ms);
> -}
> -
>  static int wait_for_engines(struct drm_i915_private *i915)
>  {
> -	struct intel_engine_cs *engine;
> -	enum intel_engine_id id;
> -
> -	for_each_engine(engine, i915, id) {
> -		if (GEM_WARN_ON(wait_for_engine(engine, 50))) {
> -			i915_gem_set_wedged(i915);
> -			return -EIO;
> -		}
> -
> -		GEM_BUG_ON(intel_engine_get_seqno(engine) !=
> -			   intel_engine_last_submit(engine));
> +	if (wait_for(intel_engines_are_idle(i915), 50)) {
> +		DRM_ERROR("Failed to idle engines, declaring wedged!\n");
> +		i915_gem_set_wedged(i915);
> +		return -EIO;
>  	}
>  
>  	return 0;
> -- 
> 2.14.1


More information about the Intel-gfx mailing list