Before we mark the virtual engine as no longer inflight, flush any
ongoing signaling that may be using the ce->signal_link along the
previous breadcrumbs. On switch to a new physical engine, that link will
be inserted into the new set of breadcrumbs, causing confusion to an
ongoing iterator.

This patch undoes a last minute mistake introduced into commit
bab0557c8dca ("drm/i915/gt: Remove virtual breadcrumb before transfer"),
whereby instead of unconditionally applying the flush, it was only
applied if the request itself was going to be reused.

Fixes: bab0557c8dca ("drm/i915/gt: Remove virtual breadcrumb before transfer")
Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/gt/intel_execlists_submission.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_execlists_submission.c 
b/drivers/gpu/drm/i915/gt/intel_execlists_submission.c
index a5b442683c18..6414dbb124a7 100644
--- a/drivers/gpu/drm/i915/gt/intel_execlists_submission.c
+++ b/drivers/gpu/drm/i915/gt/intel_execlists_submission.c
@@ -592,8 +592,6 @@ resubmit_virtual_request(struct i915_request *rq, struct 
virtual_engine *ve)
                 * ce->signal_link.
                 */
                i915_request_cancel_breadcrumb(rq);
-               while (atomic_read(&engine->breadcrumbs->signaler_active))
-                       cpu_relax();
        }
 
        spin_lock_irq(&engine->active.lock);
@@ -609,6 +607,7 @@ static void kick_siblings(struct i915_request *rq, struct 
intel_context *ce)
 {
        struct virtual_engine *ve = container_of(ce, typeof(*ve), context);
        struct intel_engine_cs *engine = rq->engine;
+       bool signals = !list_empty(&ce->signals);
 
        /*
         * This engine is now too busy to run this virtual request, so
@@ -622,6 +621,10 @@ static void kick_siblings(struct i915_request *rq, struct 
intel_context *ce)
 
        if (READ_ONCE(ve->request))
                tasklet_hi_schedule(&ve->base.execlists.tasklet);
+
+       /* Flush concurrent signal_irq_work before we reuse the link */
+       while (signals && atomic_read(&engine->breadcrumbs->signaler_active))
+               cpu_relax();
 }
 
 static inline void __execlists_schedule_out(struct i915_request *rq)
-- 
2.20.1

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

Reply via email to