mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-05 15:49:42 -04:00
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 <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
This commit is contained in:
@@ -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 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
|
||||
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 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user