drm/i915: Trim NEWCLIENT boosting
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 4 Feb 2019 15:01:01 +0000 (15:01 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 4 Feb 2019 21:54:38 +0000 (21:54 +0000)
Limit the NEWCLIENT boost to only give its small priority boost to fresh
clients only that have no dependencies.

The idea for using NEWCLIENT boosting, commit b16c765122f9 ("drm/i915:
Priority boost for new clients"), is that short-lived streams are often
interactive and require lower latency -- and that by executing those
ahead of the long running hogs, the short-lived clients do little to
interfere with the system throughput by virtue of their short-lived
nature. However, we were only considering the client's own timeline for
determining whether or not it was a fresh stream. This allowed for
compositors to wake up before their vblank and bump all of its client
streams. However, in testing with media-bench this results in chaining
all cooperating contexts together preventing us from being able to
reorder contexts to reduce bubbles (pipeline stalls), overall increasing
latency, and reducing system throughput. The exact opposite of our
intent. The compromise of applying the NEWCLIENT boost to strictly fresh
clients (that do not wait upon anything else) should maintain the
"real-time response under load" characteristics of FQ_CODEL, without
locking together the long chains of dependencies across the system.

References: b16c765122f9 ("drm/i915: Priority boost for new clients")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190204150101.30759-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_request.c

index 9ed5baf157a392c45271eebefd3d615e12ef1410..9383a9fb48933223e4df0d42075b0b60d9c8fd15 100644 (file)
@@ -968,7 +968,7 @@ void i915_request_add(struct i915_request *request)
                 * Allow interactive/synchronous clients to jump ahead of
                 * the bulk clients. (FQ_CODEL)
                 */
-               if (!prev || i915_request_completed(prev))
+               if (list_empty(&request->sched.signalers_list))
                        attr.priority |= I915_PRIORITY_NEWCLIENT;
 
                engine->schedule(request, &attr);