• Paul E. McKenney's avatar
    rcu-tasks: Use fewer callbacks queues if callback flood ends · fd796e41
    Paul E. McKenney authored
    By default, when lock contention is encountered, the RCU Tasks flavors
    of RCU switch to using per-CPU queueing.  However, if the callback
    flood ends, per-CPU queueing continues to be used, which introduces
    significant additional overhead, especially for callback invocation,
    which fans out a series of workqueue handlers.
    
    This commit therefore switches back to single-queue operation if at the
    beginning of a grace period there are very few callbacks.  The definition
    of "very few" is set by the rcupdate.rcu_task_collapse_lim module
    parameter, which defaults to 10.  This switch happens in two phases,
    with the first phase causing future callbacks to be enqueued on CPU 0's
    queue, but with all queues continuing to be checked for grace periods
    and callback invocation.  The second phase checks to see if an RCU grace
    period has elapsed and if all remaining RCU-Tasks callbacks are queued
    on CPU 0.  If so, only CPU 0 is checked for future grace periods and
    callback operation.
    
    Of course, the return of contention anywhere during this process will
    result in returning to per-CPU callback queueing.
    Reported-by: default avatarMartin Lau <kafai@fb.com>
    Cc: Neeraj Upadhyay <neeraj.iitr10@gmail.com>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    fd796e41
tasks.h 58.4 KB