unsigned long flags)
                                 __releases(rdp->nocb_lock)
 {
+       unsigned long cur_gp_seq;
+       unsigned long j;
        long len;
        struct task_struct *t;
 
        } else if (len > rdp->qlen_last_fqs_check + qhimark) {
                /* ... or if many callbacks queued. */
                rdp->qlen_last_fqs_check = len;
-               if (rdp->nocb_cb_sleep ||
-                   !rcu_segcblist_ready_cbs(&rdp->cblist)) {
+               j = jiffies;
+               if (j != rdp->nocb_gp_adv_time &&
+                   rcu_segcblist_nextgp(&rdp->cblist, &cur_gp_seq) &&
+                   rcu_seq_done(&rdp->mynode->gp_seq, cur_gp_seq)) {
                        rcu_advance_cbs_nowake(rdp->mynode, rdp);
+                       rdp->nocb_gp_adv_time = j;
+               }
+               if (rdp->nocb_cb_sleep ||
+                   !rcu_segcblist_ready_cbs(&rdp->cblist))
                        wake_nocb_gp_defer(rdp, RCU_NOCB_WAKE_FORCE,
                                           TPS("WakeOvfIsDeferred"));
-               }
                rcu_nocb_unlock_irqrestore(rdp, flags);
        } else {
                trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("WakeNot"));