• F
    rcu: Keep gpnum and completed fields synchronized · 5ff8e6f0
    Frederic Weisbecker 提交于
    When a CPU that was in an extended quiescent state wakes
    up and catches up with grace periods that remote CPUs
    completed on its behalf, we update the completed field
    but not the gpnum that keeps a stale value of a backward
    grace period ID.
    
    Later, note_new_gpnum() will interpret the shift between
    the local CPU and the node grace period ID as some new grace
    period to handle and will then start to hunt quiescent state.
    
    But if every grace periods have already been completed, this
    interpretation becomes broken. And we'll be stuck in clusters
    of spurious softirqs because rcu_report_qs_rdp() will make
    this broken state run into infinite loop.
    
    The solution, as suggested by Lai Jiangshan, is to ensure that
    the gpnum and completed fields are well synchronized when we catch
    up with completed grace periods on their behalf by other cpus.
    This way we won't start noting spurious new grace periods.
    Suggested-by: NLai Jiangshan <laijs@cn.fujitsu.com>
    Signed-off-by: NFrederic Weisbecker <fweisbec@gmail.com>
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Steven Rostedt <rostedt@goodmis.org
    Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    5ff8e6f0
rcutree.c 57.2 KB