>-----Original Message----- >From: Intel-gfx <intel-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of Chris >Wilson >Sent: Friday, July 10, 2020 8:16 AM >To: intel-gfx@xxxxxxxxxxxxxxxxxxxxx >Cc: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> >Subject: [PATCH] drm/i915/gt: Be defensive in the face of false CS >events > >If the HW throws a curve ball and reports either en event before it is ^^ s/en/an/ ? m >possible, or just a completely impossible event, we have to grin and >bear it. The first few events, we will likely not notice as we would be >expecting some event, but as soon as we stop expecting an event and yet >they still keep coming, then we enter into undefined state territory. >In which case, bail out, stop processing the events, and reset the >engine and our set of queued requests to recover. > >The sporadic hangs and warnings will continue to plague CI, but at least >system stability should not be compromised. > >Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/2045 >Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> >Cc: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> >--- > drivers/gpu/drm/i915/gt/intel_lrc.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > >diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c >b/drivers/gpu/drm/i915/gt/intel_lrc.c >index fbcfeaed6441..c86324d2d2bb 100644 >--- a/drivers/gpu/drm/i915/gt/intel_lrc.c >+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c >@@ -2567,6 +2567,7 @@ static void process_csb(struct intel_engine_cs >*engine) > tail = READ_ONCE(*execlists->csb_write); > if (unlikely(head == tail)) > return; >+ execlists->csb_head = tail; > > /* > * Hopefully paired with a wmb() in HW! >@@ -2613,6 +2614,9 @@ static void process_csb(struct intel_engine_cs >*engine) > if (promote) { > struct i915_request * const *old = execlists->active; > >+ if (GEM_WARN_ON(!*execlists->pending)) >+ break; >+ > ring_set_paused(engine, 0); > > /* Point active to the new ELSP; prevent overwriting >*/ >@@ -2635,7 +2639,8 @@ static void process_csb(struct intel_engine_cs >*engine) > > WRITE_ONCE(execlists->pending[0], NULL); > } else { >- GEM_BUG_ON(!*execlists->active); >+ if (GEM_WARN_ON(!*execlists->active)) >+ break; > > /* port0 completed, advanced to port1 */ > trace_ports(execlists, "completed", execlists->active); >@@ -2686,7 +2691,6 @@ static void process_csb(struct intel_engine_cs >*engine) > } > } while (head != tail); > >- execlists->csb_head = head; > set_timeslice(engine); > > /* >-- >2.20.1 > >_______________________________________________ >Intel-gfx mailing list >Intel-gfx@xxxxxxxxxxxxxxxxxxxxx >https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx