From: Jeff McGee <jeff.mcgee@xxxxxxxxx> We are racing with updates to the timeline. This can cause an inconsistent snapshot to be dumped, or even worse a NULL pointer dereference. Signed-off-by: Jeff McGee <jeff.mcgee@xxxxxxxxx> --- drivers/gpu/drm/i915/i915_debugfs.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 0bb6e01121fc..135828fb1904 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -657,33 +657,26 @@ static void print_request(struct seq_file *m, static int i915_gem_request_info(struct seq_file *m, void *data) { struct drm_i915_private *dev_priv = node_to_i915(m->private); - struct drm_device *dev = &dev_priv->drm; struct drm_i915_gem_request *req; struct intel_engine_cs *engine; enum intel_engine_id id; - int ret, any; - - ret = mutex_lock_interruptible(&dev->struct_mutex); - if (ret) - return ret; + int any = 0; - any = 0; for_each_engine(engine, dev_priv, id) { - int count; + int count = 0; - count = 0; + spin_lock_irq(&engine->timeline->lock); list_for_each_entry(req, &engine->timeline->requests, link) count++; - if (count == 0) - continue; - - seq_printf(m, "%s requests: %d\n", engine->name, count); - list_for_each_entry(req, &engine->timeline->requests, link) - print_request(m, req, " "); - any++; + if (count) { + seq_printf(m, "%s requests: %d\n", engine->name, count); + list_for_each_entry(req, &engine->timeline->requests, link) + print_request(m, req, " "); + any++; + } + spin_unlock_irq(&engine->timeline->lock); } - mutex_unlock(&dev->struct_mutex); if (any == 0) seq_puts(m, "No requests\n"); -- 2.14.2 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx