• Joel Fernandes (Google)'s avatar
    rcu: Reset CPU hints when reporting a quiescent state · 516e5ae0
    Joel Fernandes (Google) authored
    In some cases, tracing shows that need_heavy_qs is still set even though
    urgent_qs was cleared upon reporting of a quiescent state.  One such
    case is when the softirq reports that a CPU has passed quiescent state.
    
    Commit 671a6351 ("rcu: Avoid unnecessary softirq when system is
    idle") fixed a bug where core_needs_qs was not being cleared.  In order
    to avoid running into similar situations with the urgent-grace-period
    flags, this commit causes rcu_disable_urgency_upon_qs(), previously
    rcu_disable_tick_upon_qs(), to clear the urgency hints, ->rcu_urgent_qs
    and ->rcu_need_heavy_qs.  Note that it is possible for CPUs to go
    offline with these urgency hints still set.  This is handled because
    rcu_disable_urgency_upon_qs() is also invoked during the online process.
    
    Because these hints can be cleared both by the corresponding CPU and by
    the grace-period kthread, this commit also adds a number of READ_ONCE()
    and WRITE_ONCE() calls.
    
    Tested overnight with rcutorture running for 60 minutes on all
    configurations of RCU.
    Signed-off-by: default avatar"Joel Fernandes (Google)" <joel@joelfernandes.org>
    [ paulmck: Clear urgency flags in rcu_disable_urgency_upon_qs(). ]
    [ paulmck: Remove ->core_needs_qs from the set cleared at quiescent state. ]
    [ paulmck: Make rcu_disable_urgency_upon_qs static per kbuild test robot. ]
    Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    516e5ae0
tree.c 115 KB