• Frederic Weisbecker's avatar
    tick: Move got_idle_tick away from common flags · 3ce74f1a
    Frederic Weisbecker authored
    tick_nohz_idle_got_tick() is called by cpuidle_reflect() within the idle
    loop with interrupts enabled. This function modifies the struct
    tick_sched's bitfield "got_idle_tick". However this bitfield is stored
    within the same mask as other bitfields that can be modified from
    interrupts.
    
    Fortunately so far it looks like the only race that can happen is while
    writing ->got_idle_tick to 0, an interrupt fires and writes the
    ->idle_active field to 0. It's then possible that the interrupted write
    to ->got_idle_tick writes back the old value of ->idle_active back to 1.
    
    However if that happens, the worst possible outcome is that the time
    spent between that interrupt and the upcoming call to
    tick_nohz_idle_exit() is accounted as idle, which is negligible quantity.
    
    Still all the bitfield writes within this struct tick_sched's shadow
    mask should be IRQ-safe. Therefore move this bitfield out to its own
    storage to avoid further suprises.
    Signed-off-by: default avatarFrederic Weisbecker <frederic@kernel.org>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Link: https://lore.kernel.org/r/20240225225508.11587-12-frederic@kernel.org
    3ce74f1a
tick-sched.h 3.86 KB