drm/i915/execlists: Tweak virtual unsubmission
authorChris Wilson <chris@chris-wilson.co.uk>
Sun, 13 Oct 2019 20:30:12 +0000 (21:30 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 14 Oct 2019 11:51:17 +0000 (12:51 +0100)
Since commit e2144503bf3b ("drm/i915: Prevent bonded requests from
overtaking each other on preemption") we have restricted requests to run
on their chosen engine across preemption events. We can take this
restriction into account to know that we will want to resubmit those
requests onto the same physical engine, and so can shortcircuit the
virtual engine selection process and keep the request on the same
engine during unwind.

References: e2144503bf3b ("drm/i915: Prevent bonded requests from overtaking each other on preemption")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Ramlingam C <ramalingam.c@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191013203012.25208-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/intel_lrc.c
drivers/gpu/drm/i915/i915_request.c

index a07baeb897fef6a71792c4c89adb9bd3853040d2..ee21307ab5fe579ecc3251df712b2b43f942c00b 100644 (file)
@@ -847,7 +847,6 @@ __unwind_incomplete_requests(struct intel_engine_cs *engine)
        list_for_each_entry_safe_reverse(rq, rn,
                                         &engine->active.requests,
                                         sched.link) {
-               struct intel_engine_cs *owner;
 
                if (i915_request_completed(rq))
                        continue; /* XXX */
@@ -862,8 +861,7 @@ __unwind_incomplete_requests(struct intel_engine_cs *engine)
                 * engine so that it can be moved across onto another physical
                 * engine as load dictates.
                 */
-               owner = rq->hw_context->engine;
-               if (likely(owner == engine)) {
+               if (likely(rq->execution_mask == engine->mask)) {
                        GEM_BUG_ON(rq_prio(rq) == I915_PRIORITY_INVALID);
                        if (rq_prio(rq) != prio) {
                                prio = rq_prio(rq);
@@ -874,6 +872,8 @@ __unwind_incomplete_requests(struct intel_engine_cs *engine)
                        list_move(&rq->sched.link, pl);
                        active = rq;
                } else {
+                       struct intel_engine_cs *owner = rq->hw_context->engine;
+
                        /*
                         * Decouple the virtual breadcrumb before moving it
                         * back to the virtual engine -- we don't want the
index 437f9fc6282e39a12b1ce5357fe6e15247421485..b8a54572a4f87ffa675de25dd56f829d0b8255a5 100644 (file)
@@ -649,6 +649,7 @@ __i915_request_create(struct intel_context *ce, gfp_t gfp)
        rq->gem_context = ce->gem_context;
        rq->engine = ce->engine;
        rq->ring = ce->ring;
+       rq->execution_mask = ce->engine->mask;
 
        rcu_assign_pointer(rq->timeline, tl);
        rq->hwsp_seqno = tl->hwsp_seqno;
@@ -671,7 +672,6 @@ __i915_request_create(struct intel_context *ce, gfp_t gfp)
        rq->batch = NULL;
        rq->capture_list = NULL;
        rq->flags = 0;
-       rq->execution_mask = ALL_ENGINES;
 
        INIT_LIST_HEAD(&rq->execute_cb);