[PATCH 2/3] drm/i915: Special case kernel_context switch request

Chris Wilson chris at chris-wilson.co.uk
Tue May 22 23:44:45 UTC 2018


From: Mika Kuoppala <mika.kuoppala at intel.com>

When checking if engine is idling on a kernel context,
the last request emitted to it could have been the exact
request to switch into kernel context.

Do not bail out early even if engine has requests,
if the last request was for kernel context.

Fixes: a89d1f921c15 ("drm/i915: Split i915_gem_timeline into individual timelines")
Cc: Chris Wilson <chris at chris-wilson.co.uk>
Signed-off-by: Mika Kuoppala <mika.kuoppala at intel.com>
Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_gem_context.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index b69b18ef8120..c46a90edc372 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -589,16 +589,25 @@ last_request_on_engine(struct i915_timeline *timeline,
 
 static bool engine_has_idle_kernel_context(struct intel_engine_cs *engine)
 {
-	struct list_head * const active_rings = &engine->i915->gt.active_rings;
+	struct drm_i915_private *i915 = engine->i915;
+	struct list_head * const active_rings = &i915->gt.active_rings;
 	struct intel_ring *ring;
 
-	lockdep_assert_held(&engine->i915->drm.struct_mutex);
+	lockdep_assert_held(&i915->drm.struct_mutex);
+
+	/* Is the switch-to-kernel-context still in flight? */
+	ring = to_intel_context(i915->kernel_context, engine)->ring;
+	if (i915_gem_active_raw(&ring->timeline->last_request,
+				&i915->drm.struct_mutex))
+		return true;
 
+	/* Any other request still pending, queue a subsequent switch */
 	list_for_each_entry(ring, active_rings, active_link) {
 		if (last_request_on_engine(ring->timeline, engine))
 			return false;
 	}
 
+	/* Idle engine; is it already resting in the kernel context? */
 	return intel_engine_has_kernel_context(engine);
 }
 
-- 
2.17.0



More information about the Intel-gfx-trybot mailing list