spin_lock(&b->irq_lock);
        GEM_BUG_ON(!b->irq_armed);
+       GEM_BUG_ON(!b->irq_wait);
        b->irq_wait = to_wait(next);
        spin_unlock(&b->irq_lock);
 
        rb_link_node(&wait->node, parent, p);
        rb_insert_color(&wait->node, &b->waiters);
 
-       if (completed) {
-               struct rb_node *next = rb_next(completed);
-
-               GEM_BUG_ON(!next && !first);
-               if (next && next != &wait->node) {
-                       GEM_BUG_ON(first);
-                       __intel_breadcrumbs_next(engine, next);
-               }
-
-               do {
-                       struct intel_wait *crumb = to_wait(completed);
-                       completed = rb_prev(completed);
-                       __intel_breadcrumbs_finish(b, crumb);
-               } while (completed);
-       }
-
        if (first) {
                spin_lock(&b->irq_lock);
-               GEM_BUG_ON(rb_first(&b->waiters) != &wait->node);
                b->irq_wait = wait;
                /* After assigning ourselves as the new bottom-half, we must
                 * perform a cursory check to prevent a missed interrupt.
                __intel_breadcrumbs_enable_irq(b);
                spin_unlock(&b->irq_lock);
        }
+
+       if (completed) {
+               if (!first) {
+                       struct rb_node *next = rb_next(completed);
+                       GEM_BUG_ON(next == &wait->node);
+                       __intel_breadcrumbs_next(engine, next);
+               }
+
+               do {
+                       struct intel_wait *crumb = to_wait(completed);
+                       completed = rb_prev(completed);
+                       __intel_breadcrumbs_finish(b, crumb);
+               } while (completed);
+       }
+
        GEM_BUG_ON(!b->irq_wait);
+       GEM_BUG_ON(!b->irq_armed);
        GEM_BUG_ON(rb_first(&b->waiters) != &b->irq_wait->node);
 
        return first;