drm/i915/gt: Simplify virtual engine handling for execlists_hold()
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 24 Dec 2020 13:55:43 +0000 (13:55 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 24 Dec 2020 15:02:41 +0000 (15:02 +0000)
Now that the tasklet completely controls scheduling of the requests, and
we postpone scheduling out the old requests, we can keep a hanging
virtual request bound to the engine on which it hung, and remove it from
te queue. On release, it will be returned to the same engine and remain
in its queue until it is scheduled; after which point it will become
eligible for transfer to a sibling. Instead, we could opt to resubmit the
request along the virtual engine on unhold, making it eligible for load
balancing immediately -- but that seems like a pointless optimisation
for a hanging context.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20201224135544.1713-8-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_execlists_submission.c

index 2d7a144..dc1312d 100644 (file)
@@ -2048,35 +2048,6 @@ static bool execlists_hold(struct intel_engine_cs *engine,
                goto unlock;
        }
 
-       if (rq->engine != engine) { /* preempted virtual engine */
-               struct virtual_engine *ve = to_virtual_engine(rq->engine);
-
-               /*
-                * intel_context_inflight() is only protected by virtue
-                * of process_csb() being called only by the tasklet (or
-                * directly from inside reset while the tasklet is suspended).
-                * Assert that neither of those are allowed to run while we
-                * poke at the request queues.
-                */
-               GEM_BUG_ON(!reset_in_progress(&engine->execlists));
-
-               /*
-                * An unsubmitted request along a virtual engine will
-                * remain on the active (this) engine until we are able
-                * to process the context switch away (and so mark the
-                * context as no longer in flight). That cannot have happened
-                * yet, otherwise we would not be hanging!
-                */
-               spin_lock(&ve->base.active.lock);
-               GEM_BUG_ON(intel_context_inflight(rq->context) != engine);
-               GEM_BUG_ON(ve->request != rq);
-               ve->request = NULL;
-               spin_unlock(&ve->base.active.lock);
-               i915_request_put(rq);
-
-               rq->engine = engine;
-       }
-
        /*
         * Transfer this request onto the hold queue to prevent it
         * being resumbitted to HW (and potentially completed) before we have