rcu-tasks: Set ->percpu_enqueue_shift to zero upon contention

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2076713

commit 00a8b4b54cd69d9f7ba1730d3b266469a778b1d7
Author: Paul E. McKenney <paulmck@kernel.org>
Date:   Wed, 2 Feb 2022 16:34:40 -0800

    rcu-tasks: Set ->percpu_enqueue_shift to zero upon contention

    Currently, call_rcu_tasks_generic() sets ->percpu_enqueue_shift to
    order_base_2(nr_cpu_ids) upon encountering sufficient contention.
    This does not shift to use of non-CPU-0 callback queues as intended, but
    rather continues using only CPU 0's queue.  Although this does provide
    some decrease in contention due to spreading work over multiple locks,
    it is not the dramatic decrease that was intended.

    This commit therefore makes call_rcu_tasks_generic() set
    ->percpu_enqueue_shift to 0.

    Reported-by: Neeraj Upadhyay <quic_neeraju@quicinc.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
This commit is contained in:
Waiman Long 2022-05-12 08:30:05 -04:00
parent 629bdee659
commit bb11f6a4ad
1 changed files with 1 additions and 1 deletions

View File

@ -302,7 +302,7 @@ static void call_rcu_tasks_generic(struct rcu_head *rhp, rcu_callback_t func,
if (unlikely(needadjust)) {
raw_spin_lock_irqsave(&rtp->cbs_gbl_lock, flags);
if (rtp->percpu_enqueue_lim != nr_cpu_ids) {
WRITE_ONCE(rtp->percpu_enqueue_shift, order_base_2(nr_cpu_ids));
WRITE_ONCE(rtp->percpu_enqueue_shift, 0);
WRITE_ONCE(rtp->percpu_dequeue_lim, nr_cpu_ids);
smp_store_release(&rtp->percpu_enqueue_lim, nr_cpu_ids);
pr_info("Switching %s to per-CPU callback queuing.\n", rtp->name);