drm/i915/gt: Add breadcrumb retire to physical engine
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 19 Dec 2019 22:13:44 +0000 (22:13 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 19 Dec 2019 23:24:48 +0000 (23:24 +0000)
Avoid adding the retire workers to the virtual engine so that we don't
end up in the unenviable situation of trying to free the virtual engine
while its worker remains active.

Fixes: dc93c9b69315 ("drm/i915/gt: Schedule request retirement when signaler idles")
Closes: https://gitlab.freedesktop.org/drm/intel/issues/867
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Acked-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191219221344.161523-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
drivers/gpu/drm/i915/gt/intel_lrc.c

index 4f491791b4ba7c0dbbd7dc643cd5d7ec80a84810..2979f0fd9270f9f3820489ef64985f78d1080cf2 100644 (file)
@@ -131,6 +131,14 @@ __dma_fence_signal__notify(struct dma_fence *fence,
        }
 }
 
+static void add_retire(struct intel_breadcrumbs *b, struct intel_timeline *tl)
+{
+       struct intel_engine_cs *engine =
+               container_of(b, struct intel_engine_cs, breadcrumbs);
+
+       intel_engine_add_retire(engine, tl);
+}
+
 static void signal_irq_work(struct irq_work *work)
 {
        struct intel_breadcrumbs *b = container_of(work, typeof(*b), irq_work);
@@ -182,8 +190,7 @@ static void signal_irq_work(struct irq_work *work)
                        __list_del_many(&ce->signals, pos);
                        if (&ce->signals == pos) { /* now empty */
                                list_del_init(&ce->signal_link);
-                               intel_engine_add_retire(ce->engine,
-                                                       ce->timeline);
+                               add_retire(b, ce->timeline);
                        }
                }
        }
index 56cf71d8bbda1dfb5f1143fcb949fd363582c27f..31815d5e3b742f7e03301d27d47e70e8f25356c0 100644 (file)
@@ -4512,7 +4512,6 @@ intel_execlists_create_virtual(struct i915_gem_context *ctx,
        intel_engine_init_active(&ve->base, ENGINE_VIRTUAL);
        intel_engine_init_breadcrumbs(&ve->base);
        intel_engine_init_execlists(&ve->base);
-       intel_engine_init_retire(&ve->base);
 
        ve->base.cops = &virtual_context_ops;
        ve->base.request_alloc = execlists_request_alloc;