drm/i915/gt: Check the virtual still matches upon locking
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 4 Jan 2021 11:51:43 +0000 (11:51 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 5 Jan 2021 09:18:05 +0000 (09:18 +0000)
If another sibling is able to claim the virtual request, by the time we
inspect the request under the lock it may no longer match the local
engine.

Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/2877
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Andi Shyti <andi.shyti@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210104115145.24460-4-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_execlists_submission.c

index f02e3ae..a5b4426 100644 (file)
@@ -1016,6 +1016,9 @@ static bool virtual_matches(const struct virtual_engine *ve,
 {
        const struct intel_engine_cs *inflight;
 
+       if (!rq)
+               return false;
+
        if (!(rq->execution_mask & engine->mask)) /* We peeked too soon! */
                return false;
 
@@ -1423,8 +1426,8 @@ check_secondary:
                spin_lock(&ve->base.active.lock);
 
                rq = ve->request;
-               if (unlikely(!rq)) /* lost the race to a sibling */
-                       goto unlock;
+               if (unlikely(!virtual_matches(ve, rq, engine)))
+                       goto unlock; /* lost the race to a sibling */
 
                GEM_BUG_ON(rq->engine != &ve->base);
                GEM_BUG_ON(rq->context != &ve->context);
@@ -1434,8 +1437,6 @@ check_secondary:
                        break;
                }
 
-               GEM_BUG_ON(!virtual_matches(ve, rq, engine));
-
                if (last && !can_merge_rq(last, rq)) {
                        spin_unlock(&ve->base.active.lock);
                        spin_unlock(&engine->active.lock);