When resetting the context image after a GPU reset, it is vital that we
do inspect the context image that was active at the time of the hang.
Even a 'pardoned' context may still have some residual corruption (e.g.
the STOP_RING bit) from issuing the GPU reset that we need to fixup
before continuing.

Signed-off-by: Chris Wilson <[email protected]>
Cc: Mika Kuoppala <[email protected]>
---
 drivers/gpu/drm/i915/intel_lrc.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 37fe842de639..246daacb545e 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -322,9 +322,10 @@ static void unwind_wa_tail(struct i915_request *rq)
        assert_ring_tail_valid(rq->ring, rq->tail);
 }
 
-static void __unwind_incomplete_requests(struct intel_engine_cs *engine)
+static struct i915_request *
+__unwind_incomplete_requests(struct intel_engine_cs *engine)
 {
-       struct i915_request *rq, *rn;
+       struct i915_request *rq, *rn, *active = NULL;
        struct i915_priolist *uninitialized_var(p);
        int last_prio = I915_PRIORITY_INVALID;
 
@@ -334,7 +335,7 @@ static void __unwind_incomplete_requests(struct 
intel_engine_cs *engine)
                                         &engine->timeline.requests,
                                         link) {
                if (i915_request_completed(rq))
-                       return;
+                       break;
 
                __i915_request_unsubmit(rq);
                unwind_wa_tail(rq);
@@ -347,7 +348,11 @@ static void __unwind_incomplete_requests(struct 
intel_engine_cs *engine)
 
                GEM_BUG_ON(p->priority != rq_prio(rq));
                list_add(&rq->sched.link, &p->requests);
+
+               active = rq;
        }
+
+       return active;
 }
 
 void
@@ -1911,7 +1916,7 @@ static void execlists_reset(struct intel_engine_cs 
*engine,
        execlists_cancel_port_requests(execlists);
 
        /* Push back any incomplete requests for replay after the reset. */
-       __unwind_incomplete_requests(engine);
+       request = __unwind_incomplete_requests(engine);
 
        /* Following the reset, we need to reload the CSB read/write pointers */
        reset_csb_pointers(&engine->execlists);
-- 
2.18.0

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to