And store the active request so that we only search for it once.

v2: Check for request completion inside _prepare_engine, don't use
ECANCELED, remove unnecessary null checks (Chris).

v3: Capture active requests during reset_prepare and store it the
engine hangcheck obj.

v4: Rename commit, change i915_gem_reset_request to just confirm the
active_request is still incomplete, instead of engine_stalled (Chris).

v5: With style; pass the active request to gem_reset_engine, keep single
return in reset_prepare_engine (Chris).

v6: Moved before reset-engine code appears (Chris)

Suggested-by: Chris Wilson <ch...@chris-wilson.co.uk>
Reviewed-by: Chris Wilson <ch...@chris-wilson.co.uk> (v5)
Signed-off-by: Michel Thierry <michel.thie...@intel.com>
---
 drivers/gpu/drm/i915/i915_gem.c         | 14 +++++++-------
 drivers/gpu/drm/i915/intel_ringbuffer.h |  1 +
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 31cbe78171a9..4722cd3567a5 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2820,7 +2820,7 @@ int i915_gem_reset_prepare(struct drm_i915_private 
*dev_priv)
 
        /* Ensure irq handler finishes, and not run again. */
        for_each_engine(engine, dev_priv, id) {
-               struct drm_i915_gem_request *request;
+               struct drm_i915_gem_request *request = NULL;
 
                /* Prevent the signaler thread from updating the request
                 * state (by calling dma_fence_signal) as we are processing
@@ -2852,6 +2852,8 @@ int i915_gem_reset_prepare(struct drm_i915_private 
*dev_priv)
                        if (request && request->fence.error == -EIO)
                                err = -EIO; /* Previous reset failed! */
                }
+
+               engine->hangcheck.active_request = request;
        }
 
        i915_gem_revoke_fences(dev_priv);
@@ -2905,7 +2907,7 @@ static void engine_skip_context(struct 
drm_i915_gem_request *request)
 static bool i915_gem_reset_request(struct drm_i915_gem_request *request)
 {
        /* Read once and return the resolution */
-       const bool guilty = engine_stalled(request->engine);
+       const bool guilty = !i915_gem_request_completed(request);
 
        /* The guilty request will get skipped on a hung engine.
         *
@@ -2939,11 +2941,9 @@ static bool i915_gem_reset_request(struct 
drm_i915_gem_request *request)
        return guilty;
 }
 
-static void i915_gem_reset_engine(struct intel_engine_cs *engine)
+static void i915_gem_reset_engine(struct intel_engine_cs *engine,
+                                 struct drm_i915_gem_request *request)
 {
-       struct drm_i915_gem_request *request;
-
-       request = i915_gem_find_active_request(engine);
        if (request && i915_gem_reset_request(request)) {
                DRM_DEBUG_DRIVER("resetting %s to restart from tail of request 
0x%x\n",
                                 engine->name, request->global_seqno);
@@ -2969,7 +2969,7 @@ void i915_gem_reset(struct drm_i915_private *dev_priv)
        for_each_engine(engine, dev_priv, id) {
                struct i915_gem_context *ctx;
 
-               i915_gem_reset_engine(engine);
+               i915_gem_reset_engine(engine, engine->hangcheck.active_request);
                ctx = fetch_and_zero(&engine->last_retired_context);
                if (ctx)
                        engine->context_unpin(engine, ctx);
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h 
b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 6aa20ac8cde3..d33c93444c0d 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -121,6 +121,7 @@ struct intel_engine_hangcheck {
        unsigned long action_timestamp;
        int deadlock;
        struct intel_instdone instdone;
+       struct drm_i915_gem_request *active_request;
        bool stalled;
 };
 
-- 
2.11.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to