[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