[Intel-gfx] [PATCH] drm/i915/execlists: Enable timeslice on partial virtual engine dequeue

Chris Wilson chris at chris-wilson.co.uk
Thu Mar 5 07:35:31 UTC 2020


If we stop filling the ELSP due to an incompatible virtual engine
request, check if we should enable the timeslice on behalf of the queue.

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/gt/intel_lrc.c | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index 5da86a40434c..954bd4797482 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -1802,6 +1802,20 @@ static void set_timeslice(struct intel_engine_cs *engine)
 	set_timer_ms(&engine->execlists.timer, active_timeslice(engine));
 }
 
+static void start_timeslice(struct intel_engine_cs *engine,
+			    struct i915_request *last)
+{
+	struct intel_engine_execlists *execlists = &engine->execlists;
+
+	/* As we are returning early, update the hint from the queue */
+	execlists->switch_priority_hint =
+		max(execlists->queue_priority_hint,
+		    execlists->switch_priority_hint);
+
+	if (!execlists->timer.expires && need_timeslice(engine, last))
+		set_timer_ms(&execlists->timer, timeslice(engine));
+}
+
 static void record_preemption(struct intel_engine_execlists *execlists)
 {
 	(void)I915_SELFTEST_ONLY(execlists->preempt_hang.count++);
@@ -1965,11 +1979,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
 				 * Even if ELSP[1] is occupied and not worthy
 				 * of timeslices, our queue might be.
 				 */
-				if (!execlists->timer.expires &&
-				    need_timeslice(engine, last))
-					set_timer_ms(&execlists->timer,
-						     timeslice(engine));
-
+				start_timeslice(engine, last);
 				return;
 			}
 		}
@@ -2004,6 +2014,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
 
 			if (last && !can_merge_rq(last, rq)) {
 				spin_unlock(&ve->base.active.lock);
+				start_timeslice(engine, last);
 				return; /* leave this for another */
 			}
 
-- 
2.25.1



More information about the Intel-gfx mailing list