[PATCH 6/6] stop-machine

Chris Wilson chris at chris-wilson.co.uk
Tue Mar 6 08:13:38 UTC 2018


---
 drivers/gpu/drm/i915/i915_gem.c | 86 ++++++++++++++---------------------------
 1 file changed, 29 insertions(+), 57 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index c89cf172b2a7..56d0a3d662c0 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -3179,13 +3179,6 @@ void i915_gem_reset_finish(struct drm_i915_private *dev_priv)
 }
 
 static void nop_submit_request(struct i915_request *request)
-{
-	dma_fence_set_error(&request->fence, -EIO);
-
-	i915_request_submit(request);
-}
-
-static void nop_complete_submit_request(struct i915_request *request)
 {
 	unsigned long flags;
 
@@ -3197,75 +3190,54 @@ static void nop_complete_submit_request(struct i915_request *request)
 	spin_unlock_irqrestore(&request->engine->timeline->lock, flags);
 }
 
-void i915_gem_set_wedged(struct drm_i915_private *i915)
+static int __i915_gem_set_wedged__BKL(void *arg)
 {
+	struct drm_i915_private *i915 = arg;
 	struct intel_engine_cs *engine;
 	enum intel_engine_id id;
 
-	if (drm_debug & DRM_UT_DRIVER) {
-		struct drm_printer p = drm_debug_printer(__func__);
-
-		for_each_engine(engine, i915, id)
-			intel_engine_dump(engine, &p, "%s\n", engine->name);
-	}
-
-	set_bit(I915_WEDGED, &i915->gpu_error.flags);
-	smp_mb__after_atomic();
-
-	/*
-	 * First, stop submission to hw, but do not yet complete requests by
-	 * rolling the global seqno forward (since this would complete requests
-	 * for which we haven't set the fence error to EIO yet).
-	 */
-	disable_irq(i915->drm.irq);
 	for_each_engine(engine, i915, id) {
-		i915_gem_reset_prepare_engine(engine);
+		unsigned long flags;
+
+		engine->cancel_requests(engine);
 
 		engine->submit_request = nop_submit_request;
 		engine->schedule = NULL;
+
+		spin_lock_irqsave(&engine->timeline->lock, flags);
+		intel_engine_init_global_seqno(engine,
+					       intel_engine_last_submit(engine));
+		spin_unlock_irqrestore(&engine->timeline->lock, flags);
+
 	}
 	i915->caps.scheduler = 0;
 
-	/*
-	 * Make sure no one is running the old callback before we proceed with
-	 * cancelling requests and resetting the completion tracking. Otherwise
-	 * we might submit a request to the hardware which never completes.
-	 */
-	synchronize_rcu();
+	return 0;
+}
 
-	for_each_engine(engine, i915, id) {
-		/* Mark all executing requests as skipped */
-		engine->cancel_requests(engine);
+void i915_gem_set_wedged(struct drm_i915_private *i915)
+{
+	struct intel_engine_cs *engine;
+	enum intel_engine_id id;
 
-		/*
-		 * Only once we've force-cancelled all in-flight requests can we
-		 * start to complete all requests.
-		 */
-		engine->submit_request = nop_complete_submit_request;
+	if (drm_debug & DRM_UT_DRIVER) {
+		struct drm_printer p = drm_debug_printer(__func__);
+
+		for_each_engine(engine, i915, id)
+			intel_engine_dump(engine, &p, "%s\n", engine->name);
 	}
 
-	/*
-	 * Make sure no request can slip through without getting completed by
-	 * either this call here to intel_engine_init_global_seqno, or the one
-	 * in nop_complete_submit_request.
-	 */
-	synchronize_rcu();
+	set_bit(I915_WEDGED, &i915->gpu_error.flags);
+	smp_mb__after_atomic();
 
-	for_each_engine(engine, i915, id) {
-		unsigned long flags;
+	stop_machine(__i915_gem_set_wedged__BKL, i915, NULL);
 
-		/*
-		 * Mark all pending requests as complete so that any concurrent
-		 * (lockless) lookup doesn't try and wait upon the request as we
-		 * reset it.
-		 */
-		spin_lock_irqsave(&engine->timeline->lock, flags);
-		intel_engine_init_global_seqno(engine,
-					       intel_engine_last_submit(engine));
-		spin_unlock_irqrestore(&engine->timeline->lock, flags);
+	disable_irq(i915->drm.irq);
+	for_each_engine(engine, i915, id)
+		i915_gem_reset_prepare_engine(engine);
 
+	for_each_engine(engine, i915, id)
 		i915_gem_reset_finish_engine(engine);
-	}
 	enable_irq(i915->drm.irq);
 
 	wake_up_all(&i915->gpu_error.reset_queue);
-- 
2.16.2



More information about the Intel-gfx-trybot mailing list