From: Tvrtko Ursulin <tvrtko.ursu...@intel.com>

With the watchdog cancelling requests asynchronously to preempt-to-busy we
need to relax one assert making it apply only to requests not in error.

v2:
 * Check against the correct request!

v3:
 * Simplify the check to avoid the question of when to sample the fence
   error vs sentinel bit.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursu...@intel.com>
---
 drivers/gpu/drm/i915/gt/intel_execlists_submission.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_execlists_submission.c 
b/drivers/gpu/drm/i915/gt/intel_execlists_submission.c
index 4b870eca9693..9d264d4ffa75 100644
--- a/drivers/gpu/drm/i915/gt/intel_execlists_submission.c
+++ b/drivers/gpu/drm/i915/gt/intel_execlists_submission.c
@@ -700,9 +700,8 @@ assert_pending_valid(const struct intel_engine_execlists 
*execlists,
 {
        struct intel_engine_cs *engine =
                container_of(execlists, typeof(*engine), execlists);
-       struct i915_request * const *port, *rq;
+       struct i915_request * const *port, *rq, *prev = NULL;
        struct intel_context *ce = NULL;
-       bool sentinel = false;
        u32 ccid = -1;
 
        trace_ports(execlists, msg, execlists->pending);
@@ -752,15 +751,20 @@ assert_pending_valid(const struct intel_engine_execlists 
*execlists,
                 * Sentinels are supposed to be the last request so they flush
                 * the current execution off the HW. Check that they are the 
only
                 * request in the pending submission.
+                *
+                * NB: Due to the async nature of preempt-to-busy and request
+                * cancellation we need to handle the case where request
+                * becomes a sentinel in parallel to CSB processing.
                 */
-               if (sentinel) {
+               if (prev && i915_request_has_sentinel(prev) &&
+                   !READ_ONCE(prev->fence.error)) {
                        GEM_TRACE_ERR("%s: context:%llx after sentinel in 
pending[%zd]\n",
                                      engine->name,
                                      ce->timeline->fence_context,
                                      port - execlists->pending);
                        return false;
                }
-               sentinel = i915_request_has_sentinel(rq);
+               prev = rq;
 
                /*
                 * We want virtual requests to only be in the first slot so
-- 
2.27.0

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

Reply via email to