From: Chris Wilson Date: Mon, 4 Jan 2021 11:51:43 +0000 (+0000) Subject: drm/i915/gt: Check the virtual still matches upon locking X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=0e58de9fc939e7552808f267bffde0b31feaf08a;p=linux.git drm/i915/gt: Check the virtual still matches upon locking 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 Reviewed-by: Andi Shyti Link: https://patchwork.freedesktop.org/patch/msgid/20210104115145.24460-4-chris@chris-wilson.co.uk --- diff --git a/drivers/gpu/drm/i915/gt/intel_execlists_submission.c b/drivers/gpu/drm/i915/gt/intel_execlists_submission.c index f02e3ae10d282..a5b442683c189 100644 --- a/drivers/gpu/drm/i915/gt/intel_execlists_submission.c +++ b/drivers/gpu/drm/i915/gt/intel_execlists_submission.c @@ -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);