Enabling the interrupt for the signaler takes a finite amount of time (a
few microseconds) during which it is possible for the request to
complete. Check afterwards and skip adding the request to the signal
rbtree if it complete.

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahti...@linux.intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursu...@intel.com>
---
 drivers/gpu/drm/i915/intel_breadcrumbs.c | 44 ++++++++++++++++++--------------
 1 file changed, 25 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_breadcrumbs.c 
b/drivers/gpu/drm/i915/intel_breadcrumbs.c
index dbcad9f6b2d5..a855771ec1a9 100644
--- a/drivers/gpu/drm/i915/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/intel_breadcrumbs.c
@@ -714,27 +714,33 @@ void intel_engine_enable_signaling(struct 
drm_i915_gem_request *request,
         */
        wakeup &= __intel_engine_add_wait(engine, &request->signaling.wait);
 
-       /* Now insert ourselves into the retirement ordered list of signals
-        * on this engine. We track the oldest seqno as that will be the
-        * first signal to complete.
-        */
-       parent = NULL;
-       first = true;
-       p = &b->signals.rb_node;
-       while (*p) {
-               parent = *p;
-               if (i915_seqno_passed(seqno,
-                                     
to_signaler(parent)->signaling.wait.seqno)) {
-                       p = &parent->rb_right;
-                       first = false;
-               } else {
-                       p = &parent->rb_left;
+       if (!__i915_gem_request_completed(request, seqno)) {
+               /* Now insert ourselves into the retirement ordered list of
+                * signals on this engine. We track the oldest seqno as that
+                * will be the first signal to complete.
+                */
+               parent = NULL;
+               first = true;
+               p = &b->signals.rb_node;
+               while (*p) {
+                       parent = *p;
+                       if (i915_seqno_passed(seqno,
+                                               
to_signaler(parent)->signaling.wait.seqno)) {
+                               p = &parent->rb_right;
+                               first = false;
+                       } else {
+                               p = &parent->rb_left;
+                       }
                }
+               rb_link_node(&request->signaling.node, parent, p);
+               rb_insert_color(&request->signaling.node, &b->signals);
+               if (first)
+                       rcu_assign_pointer(b->first_signal, request);
+       } else {
+               __intel_engine_remove_wait(engine, &request->signaling.wait);
+               i915_gem_request_put(request);
+               wakeup = false;
        }
-       rb_link_node(&request->signaling.node, parent, p);
-       rb_insert_color(&request->signaling.node, &b->signals);
-       if (first)
-               rcu_assign_pointer(b->first_signal, request);
 
        spin_unlock(&b->rb_lock);
 
-- 
2.11.0

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

Reply via email to