diff options
author | Paul E. McKenney <paulmck@kernel.org> | 2022-11-14 09:40:19 -0800 |
---|---|---|
committer | Paul E. McKenney <paulmck@kernel.org> | 2023-01-03 17:28:34 -0800 |
commit | 253cbbff621407a6265ce7a6a03c3766f8846f02 (patch) | |
tree | ba1996973ed6050657c93774b422ad544bf6d95d /kernel/rcu/tree.c | |
parent | 5a04848d005e051b8c063206b1a03363aca8ade4 (diff) | |
download | lwn-253cbbff621407a6265ce7a6a03c3766f8846f02.tar.gz lwn-253cbbff621407a6265ce7a6a03c3766f8846f02.zip |
rcu: Throttle callback invocation based on number of ready callbacks
Currently, rcu_do_batch() sizes its batches based on the total number
of callbacks in the callback list. This can result in some strange
choices, for example, if there was 12,800 callbacks in the list, but
only 200 were ready to invoke, RCU would invoke 100 at a time (12,800
shifted down by seven bits).
A more measured approach would use the number that were actually ready
to invoke, an approach that has become feasible only recently given the
per-segment ->seglen counts in ->cblist.
This commit therefore bases the batch limit on the number of callbacks
ready to invoke instead of on the total number of callbacks.
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Diffstat (limited to 'kernel/rcu/tree.c')
-rw-r--r-- | kernel/rcu/tree.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index d3b082233b74..7d3a59d4f37e 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -2057,7 +2057,7 @@ static void rcu_do_batch(struct rcu_data *rdp) */ rcu_nocb_lock_irqsave(rdp, flags); WARN_ON_ONCE(cpu_is_offline(smp_processor_id())); - pending = rcu_segcblist_n_cbs(&rdp->cblist); + pending = rcu_segcblist_get_seglen(&rdp->cblist, RCU_DONE_TAIL); div = READ_ONCE(rcu_divisor); div = div < 0 ? 7 : div > sizeof(long) * 8 - 2 ? sizeof(long) * 8 - 2 : div; bl = max(rdp->blimit, pending >> div); |