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 <ch...@chris-wilson.co.uk>
---
 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++;
-- 
2.8.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to