drm/i915: Show timeline dependencies for debug
authorTvrtko Ursulin <tvrtko.ursulin@intel.com>
Thu, 19 Nov 2020 16:56:16 +0000 (16:56 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 19 Nov 2020 20:34:18 +0000 (20:34 +0000)
Include the signalers each request in the timeline is waiting on, as a
means to try and identify the cause of a stall. This can be quite
verbose, even as for now we only show each request in the timeline and
its immediate antecedents.

This generates output like:

Timeline 886: { count 1, ready: 0, inflight: 0, seqno: { current: 664, last: 666 }, engine: rcs0 }
  U 886:29a-  prio=0 @ 134ms: gem_exec_parall<4621>
    U bc1:27a-  prio=0 @ 134ms: gem_exec_parall[4917]
Timeline 825: { count 1, ready: 0, inflight: 0, seqno: { current: 802, last: 804 }, engine: vcs0 }
  U 825:324  prio=0 @ 107ms: gem_exec_parall<4518>
    U b75:140-  prio=0 @ 110ms: gem_exec_parall<5486>
Timeline b46: { count 1, ready: 0, inflight: 0, seqno: { current: 782, last: 784 }, engine: vcs0 }
  U b46:310-  prio=0 @ 70ms: gem_exec_parall<5428>
    U c11:170-  prio=0 @ 70ms: gem_exec_parall[5501]
Timeline 96b: { count 1, ready: 0, inflight: 0, seqno: { current: 632, last: 634 }, engine: vcs0 }
  U 96b:27a-  prio=0 @ 67ms: gem_exec_parall<4878>
    U b75:19e-  prio=0 @ 67ms: gem_exec_parall<5486>

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20201119165616.10834-6-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_scheduler.c
drivers/gpu/drm/i915/i915_scheduler.h

index 354b95c..263074c 100644 (file)
@@ -45,6 +45,7 @@
 #include "i915_debugfs.h"
 #include "i915_debugfs_params.h"
 #include "i915_irq.h"
+#include "i915_scheduler.h"
 #include "i915_trace.h"
 #include "intel_pm.h"
 #include "intel_sideband.h"
@@ -1323,7 +1324,7 @@ static int i915_engine_info(struct seq_file *m, void *unused)
        for_each_uabi_engine(engine, i915)
                intel_engine_dump(engine, &p, "%s\n", engine->name);
 
-       intel_gt_show_timelines(&i915->gt, &p, NULL);
+       intel_gt_show_timelines(&i915->gt, &p, i915_request_show_with_schedule);
 
        intel_runtime_pm_put(&i915->runtime_pm, wakeref);
 
index cbb880b..b9cf993 100644 (file)
@@ -504,6 +504,34 @@ void i915_sched_node_fini(struct i915_sched_node *node)
        spin_unlock_irq(&schedule_lock);
 }
 
+void i915_request_show_with_schedule(struct drm_printer *m,
+                                    const struct i915_request *rq,
+                                    const char *prefix,
+                                    int indent)
+{
+       struct i915_dependency *dep;
+
+       i915_request_show(m, rq, prefix, indent);
+       if (i915_request_completed(rq))
+               return;
+
+       rcu_read_lock();
+       for_each_signaler(dep, rq) {
+               const struct i915_request *signaler =
+                       node_to_request(dep->signaler);
+
+               /* Dependencies along the same timeline are expected. */
+               if (signaler->timeline == rq->timeline)
+                       continue;
+
+               if (i915_request_completed(signaler))
+                       continue;
+
+               i915_request_show(m, signaler, prefix, indent + 2);
+       }
+       rcu_read_unlock();
+}
+
 static void i915_global_scheduler_shrink(void)
 {
        kmem_cache_shrink(global.slab_dependencies);
index 6f0bf00..4501e5a 100644 (file)
@@ -13,6 +13,8 @@
 
 #include "i915_scheduler_types.h"
 
+struct drm_printer;
+
 #define priolist_for_each_request(it, plist, idx) \
        for (idx = 0; idx < ARRAY_SIZE((plist)->requests); idx++) \
                list_for_each_entry(it, &(plist)->requests[idx], sched.link)
@@ -54,4 +56,9 @@ static inline void i915_priolist_free(struct i915_priolist *p)
                __i915_priolist_free(p);
 }
 
+void i915_request_show_with_schedule(struct drm_printer *m,
+                                    const struct i915_request *rq,
+                                    const char *prefix,
+                                    int indent);
+
 #endif /* _I915_SCHEDULER_H_ */