[Intel-gfx] [PATCH 07/33] drm/i915: Store the active context object on all engines upon error

Joonas Lahtinen joonas.lahtinen at linux.intel.com
Tue Aug 9 09:02:57 UTC 2016


On su, 2016-08-07 at 15:45 +0100, Chris Wilson wrote:
> With execlists, we have context objects everywhere, not just RCS. So
> store them for post-mortem debugging. This also has a secondary effect
> of removing one more unsafe list iteration with using preserved state
> from the hanging request. And now we can cross-reference the request's
> context state with that loaded by the GPU.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

Reviewed-by: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>

> ---
>  drivers/gpu/drm/i915/i915_gpu_error.c | 28 ++++------------------------
>  1 file changed, 4 insertions(+), 24 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
> index b94a59733cf8..c621fa23cd28 100644
> --- a/drivers/gpu/drm/i915/i915_gpu_error.c
> +++ b/drivers/gpu/drm/i915/i915_gpu_error.c
> @@ -1028,28 +1028,6 @@ static void error_record_engine_registers(struct drm_i915_error_state *error,
>  	}
>  }
>  
> -static void i915_gem_record_active_context(struct intel_engine_cs *engine,
> -					   struct drm_i915_error_state *error,
> -					   struct drm_i915_error_engine *ee)
> -{
> -	struct drm_i915_private *dev_priv = engine->i915;
> -	struct drm_i915_gem_object *obj;
> -
> -	/* Currently render ring is the only HW context user */
> -	if (engine->id != RCS || !error->ccid)
> -		return;
> -
> -	list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
> -		if (!i915_gem_obj_ggtt_bound(obj))
> -			continue;
> -
> -		if ((error->ccid & PAGE_MASK) == i915_gem_obj_ggtt_offset(obj)) {
> -			ee->ctx = i915_error_ggtt_object_create(dev_priv, obj);
> -			break;
> -		}
> -	}
> -}
> -
>  static void i915_gem_record_rings(struct drm_i915_private *dev_priv,
>  				  struct drm_i915_error_state *error)
>  {
> @@ -1099,6 +1077,10 @@ static void i915_gem_record_rings(struct drm_i915_private *dev_priv,
>  					i915_error_ggtt_object_create(dev_priv,
>  								      engine->scratch.obj);
>  
> +			ee->ctx =
> +				i915_error_ggtt_object_create(dev_priv,
> +							      request->ctx->engine[i].state);
> +
>  			if (request->pid) {
>  				struct task_struct *task;
>  
> @@ -1129,8 +1111,6 @@ static void i915_gem_record_rings(struct drm_i915_private *dev_priv,
>  		ee->wa_ctx = i915_error_ggtt_object_create(dev_priv,
>  							   engine->wa_ctx.obj);
>  
> -		i915_gem_record_active_context(engine, error, ee);
> -
>  		count = 0;
>  		list_for_each_entry(request, &engine->request_list, link)
>  			count++;
-- 
Joonas Lahtinen
Open Source Technology Center
Intel Corporation


More information about the Intel-gfx mailing list