Skip to content
Snippets Groups Projects
  • Koichiro Den's avatar
    3d41dbf8
    hrtimers: Handle CPU state correctly on hotplug · 3d41dbf8
    Koichiro Den authored
    
    commit 2f8dea1692eef2b7ba6a256246ed82c365fdc686 upstream.
    
    Consider a scenario where a CPU transitions from CPUHP_ONLINE to halfway
    through a CPU hotunplug down to CPUHP_HRTIMERS_PREPARE, and then back to
    CPUHP_ONLINE:
    
    Since hrtimers_prepare_cpu() does not run, cpu_base.hres_active remains set
    to 1 throughout. However, during a CPU unplug operation, the tick and the
    clockevents are shut down at CPUHP_AP_TICK_DYING. On return to the online
    state, for instance CFS incorrectly assumes that the hrtick is already
    active, and the chance of the clockevent device to transition to oneshot
    mode is also lost forever for the CPU, unless it goes back to a lower state
    than CPUHP_HRTIMERS_PREPARE once.
    
    This round-trip reveals another issue; cpu_base.online is not set to 1
    after the transition, which appears as a WARN_ON_ONCE in enqueue_hrtimer().
    
    Aside of that, the bulk of the per CPU state is not reset either, which
    means there are dangling pointers in the worst case.
    
    Address this by adding a corresponding startup() callback, which resets the
    stale per CPU state and sets the online flag.
    
    [ tglx: Make the new callback unconditionally available, remove the online
      	modification in the prepare() callback and clear the remaining
      	state in the starting callback instead of the prepare callback ]
    
    Fixes: 5c0930cc ("hrtimers: Push pending hrtimers away from outgoing CPU earlier")
    Signed-off-by: default avatarKoichiro Den <koichiro.den@canonical.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/all/20241220134421.3809834-1-koichiro.den@canonical.com
    
    
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    3d41dbf8
    History
    hrtimers: Handle CPU state correctly on hotplug
    Koichiro Den authored
    
    commit 2f8dea1692eef2b7ba6a256246ed82c365fdc686 upstream.
    
    Consider a scenario where a CPU transitions from CPUHP_ONLINE to halfway
    through a CPU hotunplug down to CPUHP_HRTIMERS_PREPARE, and then back to
    CPUHP_ONLINE:
    
    Since hrtimers_prepare_cpu() does not run, cpu_base.hres_active remains set
    to 1 throughout. However, during a CPU unplug operation, the tick and the
    clockevents are shut down at CPUHP_AP_TICK_DYING. On return to the online
    state, for instance CFS incorrectly assumes that the hrtick is already
    active, and the chance of the clockevent device to transition to oneshot
    mode is also lost forever for the CPU, unless it goes back to a lower state
    than CPUHP_HRTIMERS_PREPARE once.
    
    This round-trip reveals another issue; cpu_base.online is not set to 1
    after the transition, which appears as a WARN_ON_ONCE in enqueue_hrtimer().
    
    Aside of that, the bulk of the per CPU state is not reset either, which
    means there are dangling pointers in the worst case.
    
    Address this by adding a corresponding startup() callback, which resets the
    stale per CPU state and sets the online flag.
    
    [ tglx: Make the new callback unconditionally available, remove the online
      	modification in the prepare() callback and clear the remaining
      	state in the starting callback instead of the prepare callback ]
    
    Fixes: 5c0930cc ("hrtimers: Push pending hrtimers away from outgoing CPU earlier")
    Signed-off-by: default avatarKoichiro Den <koichiro.den@canonical.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/all/20241220134421.3809834-1-koichiro.den@canonical.com
    
    
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>