Skip to content
  • Paul E. McKenney's avatar
    rcu: Document why rcu_blocking_is_gp() is safe · 6d813391
    Paul E. McKenney authored
    
    
    The rcu_blocking_is_gp() function tests to see if there is only one
    online CPU, and if so, synchronize_sched() and friends become no-ops.
    However, for larger systems, num_online_cpus() scans a large vector,
    and might be preempted while doing so.  While preempted, any number
    of CPUs might come online and go offline, potentially resulting in
    num_online_cpus() returning 1 when there never had only been one
    CPU online.  This could result in a too-short RCU grace period, which
    could in turn result in total failure, except that the only way that
    the grace period is too short is if there is an RCU read-side critical
    section spanning it.  For RCU-sched and RCU-bh (which are the only
    cases using rcu_blocking_is_gp()), RCU read-side critical sections
    have either preemption or bh disabled, which prevents CPUs from going
    offline.  This in turn prevents actual failures from occurring.
    
    This commit therefore adds a large block comment to rcu_blocking_is_gp()
    documenting why it is safe.  This commit also moves rcu_blocking_is_gp()
    into kernel/rcutree.c, which should help prevent unwary developers from
    mistaking it for a generally useful function.
    
    Signed-off-by: default avatarPaul E. McKenney <paul.mckenney@linaro.org>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    6d813391