• Frederic Weisbecker's avatar
    rcu/nocb: Assert no callbacks while nocb kthread allocation fails · 7be88a85
    Frederic Weisbecker authored
    When a NOCB CPU fails to create a nocb kthread on bringup, the CPU is
    then deoffloaded. The barrier mutex is locked at this stage. It is
    typically used to protect against concurrent (de-)offloading and/or
    concurrent rcu_barrier() that would otherwise risk a nocb locking
    imbalance. However:
    
    * rcu_barrier() can't run concurrently if it's the boot CPU on early
      boot-up.
    
    * rcu_barrier() can run concurrently if it's a secondary CPU but it is
      expected to see 0 callbacks on this target because it's the first
      time it boots.
    
    * (de-)offloading can't happen concurrently with smp_init(), as
      rcutorture is initialized later, at least not before device_initcall(),
      and userspace isn't available yet.
    
    * (de-)offloading can't happen concurrently with cpu_up(), courtesy of
      cpu_hotplug_lock.
    
    But:
    
    * The lazy shrinker might run concurrently with cpu_up(). It shouldn't
      try to grab the nocb_lock and risk an imbalance due to lazy_len
      supposed to be 0 but be extra cautious.
    
    * Also be cautious against resume from hibernation potential subtleties.
    
    So keep the locking and add some assertions and comments.
    Signed-off-by: default avatarFrederic Weisbecker <frederic@kernel.org>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    Reviewed-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    Signed-off-by: default avatarNeeraj Upadhyay <neeraj.upadhyay@kernel.org>
    7be88a85
tree_nocb.h 52.5 KB