Skip to content

Commit 3d7a64b

Browse files
committed
drm/i915: Allow normal clients to always preempt idle priority clients
When first enabling preemption, we hesitated from making it a free-for-all where every higher priority client would force a preempt-to-idle cycle and take over from all lower priority clients. We hesitated because we were uncertain just how well preemption would work in practice, whether the preemption latency itself would detract from the latency gains for higher priority tasks and whether it would work at all. Since introducing preemption, we have been enabling it for more common tasks, even giving normal clients a small preemptive boost when they first start (to aide fairness and improve interactivity). Now lets take one step further and give permission for all normal (priority:0) clients to preempt any idle (priority:<0) task so that users running long compute jobs do not overly impact other jobs (i.e. their desktop) and the system remains responsive under such idle loads. References: f6322ed ("drm/i915/preemption: Allow preemption between submission ports") References: b16c765 ("drm/i915: Priority boost for new clients") Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com> Cc: Michał Winiarski <michal.winiarski@intel.com> Cc: "Bloomfield, Jon" <jon.bloomfield@intel.com> Cc: "Stead, Alan" <alan.stead@intel.com> Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190204084116.3013-1-chris@chris-wilson.co.uk
1 parent 46c0cd8 commit 3d7a64b

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

drivers/gpu/drm/i915/intel_ringbuffer.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,20 @@ intel_engine_has_preemption(const struct intel_engine_cs *engine)
592592

593593
static inline bool __execlists_need_preempt(int prio, int last)
594594
{
595-
return prio > max(0, last);
595+
/*
596+
* Allow preemption of low -> normal -> high, but we do
597+
* not allow low priority tasks to preempt other low priority
598+
* tasks under the impression that latency for low priority
599+
* tasks does not matter (as much as background throughput),
600+
* so kiss.
601+
*
602+
* More naturally we would write
603+
* prio >= max(0, last);
604+
* except that we wish to prevent triggering preemption at the same
605+
* priority level: the task that is running should remain running
606+
* to preserve FIFO ordering of dependencies.
607+
*/
608+
return prio > max(I915_PRIORITY_NORMAL - 1, last);
596609
}
597610

598611
static inline void

0 commit comments

Comments
 (0)