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:
Chris Wilson 2021-01-04 11:51:43 +00:00
parent 0a7d355ec6
commit 0e58de9fc9
1 changed files with 5 additions and 4 deletions

View 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);