>-----Original Message-----
>From: Intel-gfx <[email protected]> On Behalf Of Chris
>Wilson
>Sent: Friday, July 10, 2020 8:16 AM
>To: [email protected]
>Cc: Chris Wilson <[email protected]>
>Subject: [Intel-gfx] [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 <[email protected]>
>Cc: Tvrtko Ursulin <[email protected]>
>---
> 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
>[email protected]
>https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to