[PATCH 2/2] drm/i915: Mark bonded requests as non-preemptable

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Wed May 20 13:24:13 UTC 2020


From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>

Once bonded requests are executing in parallel it is at least sub-
optimal to preempt one of them and could even lead to GPU hangs with
media workloads.

Mark the bonded pairs as non-preemptable so once running they remain in
lock-step.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Suggested-by: Xiaogang Li <xiaogang.li at intel.com>
Cc: Chris Wilson <chris at chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/gt/intel_lrc.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index 3e367f6e4963..ec3c25abd07c 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -458,6 +458,9 @@ static inline bool need_preempt(const struct intel_engine_cs *engine,
 	if (!intel_engine_has_semaphores(engine))
 		return false;
 
+	if (test_bit(I915_FENCE_FLAG_NOPREEMPT, &rq->fence.flags))
+		return false;
+
 	/*
 	 * Check if the current priority hint merits a preemption attempt.
 	 *
@@ -1902,6 +1905,9 @@ need_timeslice(const struct intel_engine_cs *engine,
 	if (!intel_engine_has_timeslices(engine))
 		return false;
 
+	if (test_bit(I915_FENCE_FLAG_NOPREEMPT, &rq->fence.flags))
+		return false;
+
 	hint = engine->execlists.queue_priority_hint;
 
 	if (rb) {
@@ -4928,6 +4934,9 @@ static void execlists_park(struct intel_engine_cs *engine)
 static void
 mark_bonded_pair(struct i915_request *rq, struct i915_request *signal)
 {
+	set_bit(I915_FENCE_FLAG_NOPREEMPT, &rq->fence.flags);
+	set_bit(I915_FENCE_FLAG_NOPREEMPT, &signal->fence.flags);
+
 	intel_context_set_single_submission(rq->context);
 	intel_context_set_single_submission(signal->context);
 }
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list