• Frederic Weisbecker's avatar
    rcu/nocb: Always init segcblist on CPU up · 126d9d49
    Frederic Weisbecker authored
    How the rdp->cblist enabled state is treated at CPU-hotplug time depends
    on whether or not that ->cblist is offloaded.
    
    1) Not offloaded: The ->cblist is disabled when the CPU goes down. All
       its callbacks are migrated and none can to enqueued until after some
       later CPU-hotplug operation brings the CPU back up.
    
    2) Offloaded: The ->cblist is not disabled on CPU down because the CB/GP
       kthreads must finish invoking the remaining callbacks. There is thus
       no need to re-enable it on CPU up.
    
    Since the ->cblist offloaded state is set in stone at boot, it cannot
    change between CPU down and CPU up. So 1) and 2) are symmetrical.
    
    However, given runtime toggling of the offloaded state, there are two
    additional asymmetrical scenarios:
    
    3) The ->cblist is not offloaded when the CPU goes down. The ->cblist
       is later toggled to offloaded and then the CPU comes back up.
    
    4) The ->cblist is offloaded when the CPU goes down. The ->cblist is
       later toggled to no longer be offloaded and then the CPU comes back up.
    
    Scenario 4) is currently handled correctly. The ->cblist remains enabled
    on CPU down and gets re-initialized on CPU up. The toggling operation
    will wait until ->cblist is empty, so ->cblist will remain empty until
    CPU-up time.
    
    The scenario 3) would run into trouble though, as the rdp is disabled
    on CPU down and not re-initialized/re-enabled on CPU up.  Except that
    in this case, ->cblist is guaranteed to be empty because all its
    callbacks were migrated away at CPU-down time.  And the CPU-up code
    already initializes and enables any empty ->cblist structures in order
    to handle the possibility of early-boot invocations of call_rcu() in
    the case where such invocations don't occur.  So all that need be done
    is to adjust the locking.
    
    Cc: Josh Triplett <josh@joshtriplett.org>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Cc: Lai Jiangshan <jiangshanlai@gmail.com>
    Cc: Joel Fernandes <joel@joelfernandes.org>
    Cc: Neeraj Upadhyay <neeraju@codeaurora.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Inspired-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    Tested-by: default avatarBoqun Feng <boqun.feng@gmail.com>
    Signed-off-by: default avatarFrederic Weisbecker <frederic@kernel.org>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    126d9d49
tree.c 146 KB