• Paul E. McKenney's avatar
    rcu: Make rcu_barrier() less disruptive · b1420f1c
    Paul E. McKenney authored
    The rcu_barrier() primitive interrupts each and every CPU, registering
    a callback on every CPU.  Once all of these callbacks have been invoked,
    rcu_barrier() knows that every callback that was registered before
    the call to rcu_barrier() has also been invoked.
    
    However, there is no point in registering a callback on a CPU that
    currently has no callbacks, most especially if that CPU is in a
    deep idle state.  This commit therefore makes rcu_barrier() avoid
    interrupting CPUs that have no callbacks.  Doing this requires reworking
    the handling of orphaned callbacks, otherwise callbacks could slip through
    rcu_barrier()'s net by being orphaned from a CPU that rcu_barrier() had
    not yet interrupted to a CPU that rcu_barrier() had already interrupted.
    This reworking was needed anyway to take a first step towards weaning
    RCU from the CPU_DYING notifier's use of stop_cpu().
    Signed-off-by: default avatarPaul E. McKenney <paul.mckenney@linaro.org>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    b1420f1c
rcutree.c 82.9 KB