• Joel Fernandes (Google)'s avatar
    rcu: Avoid unnecessary softirq when system is idle · 671a6351
    Joel Fernandes (Google) authored
    When there are no callbacks pending on an idle system, I noticed that
    RCU softirq is continuously firing. During this the cpu_no_qs is set to
    false, and core_needs_qs is set to true indefinitely. This causes
    rcu_process_callbacks to be repeatedly called, even though the node
    corresponding to the CPU has that CPU's mask bit cleared and the system
    is idle. I believe the race is when such mask clearing is done during
    idle CPU scan of the quiescent state forcing stage in the kthread
    instead of the softirq. Since the rnp mask is cleared, but the flags on
    the CPU's rdp are not cleared, the CPU thinks it still needs to report
    to core RCU.
    
    Cure this by clearing the core_needs_qs flag when the CPU detects that
    its node is already updated which will avoid the unwanted softirq raises
    to the benefit of real-time systems.
    
    Test: Ran rcutorture for various tree RCU configs.
    Signed-off-by: default avatarJoel Fernandes (Google) <joel@joelfernandes.org>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.ibm.com>
    671a6351
tree.c 122 KB