aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_request.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2018-10-01 10:47:53 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2018-10-01 15:34:19 -0400
commitb16c765122f987056e1dc9ef6c214571bb5bd694 (patch)
tree4d40534af04067fbe590fbc25e0d6d221e3f7aa3 /drivers/gpu/drm/i915/i915_request.c
parent790ea70c5eb5e0893da0224cd093718b133f4461 (diff)
drm/i915: Priority boost for new clients
Taken from an idea used for FQ_CODEL, we give the first request of a new request flows a small priority boost. These flows are likely to correspond with short, interactive tasks and so be more latency sensitive than the longer free running queues. As soon as the client has more than one request in the queue, further requests are not boosted and it settles down into ordinary steady state behaviour. Such small kicks dramatically help combat the starvation issue, by allowing each client the opportunity to run even when the system is under heavy throughput load (within the constraints of the user selected priority). v2: Mark the preempted request as the start of a new flow, to prevent a single client being continually gazumped by its peers. Testcase: igt/benchmarks/rrul Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20181001144755.7978-1-chris@chris-wilson.co.uk
Diffstat (limited to 'drivers/gpu/drm/i915/i915_request.c')
-rw-r--r--drivers/gpu/drm/i915/i915_request.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
index a492385b2089..56140ca054e8 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -1127,8 +1127,20 @@ void i915_request_add(struct i915_request *request)
1127 */ 1127 */
1128 local_bh_disable(); 1128 local_bh_disable();
1129 rcu_read_lock(); /* RCU serialisation for set-wedged protection */ 1129 rcu_read_lock(); /* RCU serialisation for set-wedged protection */
1130 if (engine->schedule) 1130 if (engine->schedule) {
1131 engine->schedule(request, &request->gem_context->sched); 1131 struct i915_sched_attr attr = request->gem_context->sched;
1132
1133 /*
1134 * Boost priorities to new clients (new request flows).
1135 *
1136 * Allow interactive/synchronous clients to jump ahead of
1137 * the bulk clients. (FQ_CODEL)
1138 */
1139 if (!prev || i915_request_completed(prev))
1140 attr.priority |= I915_PRIORITY_NEWCLIENT;
1141
1142 engine->schedule(request, &attr);
1143 }
1132 rcu_read_unlock(); 1144 rcu_read_unlock();
1133 i915_sw_fence_commit(&request->submit); 1145 i915_sw_fence_commit(&request->submit);
1134 local_bh_enable(); /* Kick the execlists tasklet if just scheduled */ 1146 local_bh_enable(); /* Kick the execlists tasklet if just scheduled */