* completed.
                 */
                if (*rdp->nxttail[RCU_WAIT_TAIL] == NULL) {
-                       raw_spin_unlock(&rnp->lock); /* irqs remain disabled. */
+                       raw_spin_unlock_irq(&rnp->lock);
 
                        /*
                         * Propagate new ->completed value to rcu_node
                         * to process their callbacks.
                         */
                        rcu_for_each_node_breadth_first(rsp, rnp) {
-                               /* irqs already disabled. */
-                               raw_spin_lock(&rnp->lock);
+                               raw_spin_lock_irq(&rnp->lock);
                                rnp->completed = rsp->gpnum;
-                               /* irqs remain disabled. */
-                               raw_spin_unlock(&rnp->lock);
+                               raw_spin_unlock_irq(&rnp->lock);
+                               cond_resched();
                        }
                        rnp = rcu_get_root(rsp);
-                       raw_spin_lock(&rnp->lock); /* irqs already disabled. */
+                       raw_spin_lock_irq(&rnp->lock);
                }
 
                rsp->completed = rsp->gpnum; /* Declare grace period done. */