diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h index e92bc39c4008..4e49bb359464 100644 --- a/kernel/rcu/tree_plugin.h +++ b/kernel/rcu/tree_plugin.h @@ -1668,13 +1668,19 @@ static void __call_rcu_nocb_wake(struct rcu_data *rdp, bool was_alldone, if (!rdp->nocb_cb_sleep && rcu_segcblist_ready_cbs(&rdp->cblist)) { // Already going full tilt, so don't try to rewake. - } else if (rcu_segcblist_pend_cbs(&rdp->cblist)) { - rcu_advance_cbs_nowake(rdp->mynode, rdp); + rcu_nocb_unlock_irqrestore(rdp, flags); } else { - wake_nocb_gp_defer(rdp, RCU_NOCB_WAKE_FORCE, - TPS("WakeOvfIsDeferred")); + rcu_advance_cbs_nowake(rdp->mynode, rdp); + if (!irqs_disabled_flags(flags)) { + wake_nocb_gp(rdp, false, flags); + trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, + TPS("WakeOvf")); + } else { + wake_nocb_gp_defer(rdp, RCU_NOCB_WAKE_FORCE, + TPS("WakeOvfIsDeferred")); + rcu_nocb_unlock_irqrestore(rdp, flags); + } } - rcu_nocb_unlock_irqrestore(rdp, flags); } else { trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("WakeNot")); rcu_nocb_unlock_irqrestore(rdp, flags);