drm/i915/execlists: Avoid kicking the submission too early for rescheduling
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 26 Mar 2018 11:50:34 +0000 (12:50 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 27 Mar 2018 13:31:06 +0000 (14:31 +0100)
If the request is still waiting on external fences, it has not yet been
submitted to the HW queue and so we can forgo kicking the submission
tasklet when re-evaluating its priority.

This should have no impact other than reducing the number of tasklet
wakeups under signal heavy workloads (e.g. switching between engines).

v2: Use prebaked container_of()

References: f6322eddaff7 ("drm/i915/preemption: Allow preemption between submission ports")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: MichaƂ Winiarski <michal.winiarski@intel.com>
Cc: Michel Thierry <michel.thierry@intel.com>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180326115044.2505-2-chris@chris-wilson.co.uk
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
drivers/gpu/drm/i915/intel_lrc.c

index 9c84af5..ba7f783 100644 (file)
@@ -1060,12 +1060,16 @@ static void queue_request(struct intel_engine_cs *engine,
        list_add_tail(&pt->link, &lookup_priolist(engine, pt, prio)->requests);
 }
 
+static void __submit_queue(struct intel_engine_cs *engine, int prio)
+{
+       engine->execlists.queue_priority = prio;
+       tasklet_hi_schedule(&engine->execlists.tasklet);
+}
+
 static void submit_queue(struct intel_engine_cs *engine, int prio)
 {
-       if (prio > engine->execlists.queue_priority) {
-               engine->execlists.queue_priority = prio;
-               tasklet_hi_schedule(&engine->execlists.tasklet);
-       }
+       if (prio > engine->execlists.queue_priority)
+               __submit_queue(engine, prio);
 }
 
 static void execlists_submit_request(struct i915_request *request)
@@ -1198,7 +1202,10 @@ static void execlists_schedule(struct i915_request *request, int prio)
                        __list_del_entry(&pt->link);
                        queue_request(engine, pt, prio);
                }
-               submit_queue(engine, prio);
+
+               if (prio > engine->execlists.queue_priority &&
+                   i915_sw_fence_done(&pt_to_request(pt)->submit))
+                       __submit_queue(engine, prio);
        }
 
        spin_unlock_irq(&engine->timeline->lock);