• Anna-Maria Behnsen's avatar
    timers: Move marking timer bases idle into tick_nohz_stop_tick() · e2e1d724
    Anna-Maria Behnsen authored
    The timer base is marked idle when get_next_timer_interrupt() is
    executed. But the decision whether the tick will be stopped and whether the
    system is able to go idle is done later. When the timer bases is marked
    idle and a new first timer is enqueued remote an IPI is raised. Even if it
    is not required because the tick is not stopped and the timer base is
    evaluated again at the next tick.
    
    To prevent this, the timer base is marked idle in tick_nohz_stop_tick() and
    get_next_timer_interrupt() is streamlined by only looking for the next timer
    interrupt. All other work is postponed to timer_base_try_to_set_idle() which is
    called by tick_nohz_stop_tick(). timer_base_try_to_set_idle() never resets
    timer_base::is_idle state. This is done when the tick is restarted via
    tick_nohz_restart_sched_tick().
    
    With this, tick_sched::tick_stopped and timer_base::is_idle are always in
    sync. So there is no longer the need to execute timer_clear_idle() in
    tick_nohz_idle_retain_tick(). This was required before, as
    tick_nohz_next_event() set timer_base::is_idle even if the tick would not be
    stopped. So timer_clear_idle() is only executed, when timer base is idle. So the
    check whether timer base is idle, is now no longer required as well.
    
    While at it fix some nearby whitespace damage as well.
    Signed-off-by: default avatarAnna-Maria Behnsen <anna-maria@linutronix.de>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Reviewed-by: default avatarFrederic Weisbecker <frederic@kernel.org>
    Link: https://lore.kernel.org/r/20240221090548.36600-4-anna-maria@linutronix.de
    e2e1d724
tick-internal.h 7.94 KB