• Alexander Gordeev's avatar
    rcu: Remove redundant rcu_is_cpu_rrupt_from_idle() from tiny RCU · ca9558a3
    Alexander Gordeev authored
    Let's start assuming that something in the idle loop posts a callback,
    and scheduling-clock interrupt occurs:
    
    1. The system is idle and stays that way, no runnable tasks.
    
    2. Scheduling-clock interrupt occurs, rcu_check_callbacks() is called
       as result, which in turn calls rcu_is_cpu_rrupt_from_idle().
    
    3. rcu_is_cpu_rrupt_from_idle() reports the CPU was interrupted from
       idle, which results in rcu_sched_qs() call, which does a
       raise_softirq(RCU_SOFTIRQ).
    
    4. Upon return from interrupt, rcu_irq_exit() is invoked, which calls
       rcu_idle_enter_common(), which in turn calls rcu_sched_qs() again,
       which does another raise_softirq(RCU_SOFTIRQ).
    
    5. The softirq happens shortly and invokes rcu_process_callbacks(),
       which invokes __rcu_process_callbacks().
    
    6. So now callbacks can be invoked. At least they can be if
       ->donetail has been updated. Which it will have been because
       rcu_sched_qs() invokes rcu_qsctr_help().
    
    In the described scenario rcu_sched_qs() and raise_softirq(RCU_SOFTIRQ)
    get called twice in steps 3 and 4. This redundancy could be eliminated
    by removing rcu_is_cpu_rrupt_from_idle() function.
    Signed-off-by: default avatarAlexander Gordeev <agordeev@redhat.com>
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    ca9558a3
tiny.c 10.2 KB