[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