• Paul E. McKenney's avatar
    rcu: Disable preemption in rcu_is_cpu_idle() · 34240697
    Paul E. McKenney authored
    Because rcu_is_cpu_idle() is to be used to check for extended quiescent
    states in RCU-preempt read-side critical sections, it cannot assume that
    preemption is disabled.  And preemption must be disabled when accessing
    the dyntick-idle state, because otherwise the following sequence of events
    could occur:
    
    1.	Task A on CPU 1 enters rcu_is_cpu_idle() and picks up the pointer
    	to CPU 1's per-CPU variables.
    
    2.	Task B preempts Task A and starts running on CPU 1.
    
    3.	Task A migrates to CPU 2.
    
    4.	Task B blocks, leaving CPU 1 idle.
    
    5.	Task A continues execution on CPU 2, accessing CPU 1's dyntick-idle
    	information using the pointer fetched in step 1 above, and finds
    	that CPU 1 is idle.
    
    6.	Task A therefore incorrectly concludes that it is executing in
    	an extended quiescent state, possibly issuing a spurious splat.
    
    Therefore, this commit disables preemption within the rcu_is_cpu_idle()
    function.
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    Reviewed-by: default avatarJosh Triplett <josh@joshtriplett.org>
    34240697
rcutree.c 68.5 KB