diff options
author | Paul E. McKenney <paulmck@linux.ibm.com> | 2019-07-09 15:54:42 +0200 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.ibm.com> | 2019-08-13 23:38:24 +0200 |
commit | 273f034065002bf9480601d66404c991b243b91e (patch) | |
tree | 544e3ca35b7efaa122064ecdfad5ee43ad006dd8 /kernel/rcu | |
parent | rcu/nocb: Print no-CBs diagnostics when rcutorture writer unduly delayed (diff) | |
download | linux-273f034065002bf9480601d66404c991b243b91e.tar.xz linux-273f034065002bf9480601d66404c991b243b91e.zip |
rcu/nocb: Avoid synchronous wakeup in __call_rcu_nocb_wake()
When callbacks are in full flow, the common case is waiting for a
grace period, and this grace period will normally take a few jiffies to
complete. It therefore isn't all that helpful for __call_rcu_nocb_wake()
to do a synchronous wakeup in this case. This commit therefore turns this
into a timer-based deferred wakeup of the no-CBs grace-period kthread.
Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com>
Diffstat (limited to 'kernel/rcu')
-rw-r--r-- | kernel/rcu/tree_plugin.h | 19 |
1 files changed, 5 insertions, 14 deletions
diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h index 25a53742ca68..4b59ef1cbc8b 100644 --- a/kernel/rcu/tree_plugin.h +++ b/kernel/rcu/tree_plugin.h @@ -1900,22 +1900,13 @@ static void __call_rcu_nocb_wake(struct rcu_data *rdp, bool was_alldone, } 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)) { - // Already going full tilt, so don't try to rewake. - rcu_nocb_unlock_irqrestore(rdp, flags); - } else { + if (rdp->nocb_cb_sleep || + !rcu_segcblist_ready_cbs(&rdp->cblist)) { 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); - } + 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")); rcu_nocb_unlock_irqrestore(rdp, flags); |