nohz: fix wrong event handler after online an offlined cpu
PATCH 1/1 nohz: fix wrong event handler after online an offlined cpu
On the tickless system(CONFIG_NO_HZ=y and CONFIG_HIGH_RES_TIMERS=n), after I made an offlined cpu online, I found this cpu's event handler was tick_handle_periodic, not tick_nohz_handler.
After debuging, I found this bug was caused by the wrong tick mode. the tick mode is not changed to NOHZ_MODE_INACTIVE when the cpu is offline.
This patch fixes this bug.
Signed-off-by Miao Xie <[email protected]>
--- include/linux/tick.h | 5 ++++- kernel/time/tick-sched.c | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-)
include/linux/tick.h +4 -1
@@ -74,10 +74,13 @@ extern struct tick_device *tick_get_device(int cpu);extern int tick_init_highres (void );extern int tick_program_event (ktime_t expires,int force);extern void tick_setup_sched_timer (void ); +# endif + +# if definedCONFIG_NO_HZ || definedCONFIG_HIGH_RES_TIMERS extern void tick_cancel_sched_timer (int cpu);# else static inline void tick_cancel_sched_timer (int cpu) { } -# endif /* HIGHRES */ +# endif # ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST extern struct tick_device *tick_get_broadcast_device (void );
kernel/time/tick-sched.c +5 -1
@@ -645,17 +645,21 @@ void tick_setup_sched_timer(void) ts->nohz_mode =NOHZ_MODE_HIGHRES ; #endif } +#endif /* HIGH_RES_TIMERS */ +#if definedCONFIG_NO_HZ || definedCONFIG_HIGH_RES_TIMERS void tick_cancel_sched_timer (int cpu) {struct tick_sched *ts = &per_cpu (tick_cpu_sched, cpu); +# ifdef CONFIG_HIGH_RES_TIMERS if (ts->sched_timer.base)hrtimer_cancel (&ts->sched_timer); +# endif ts->nohz_mode =NOHZ_MODE_INACTIVE ; } -#endif /* HIGH_RES_TIMERS */ +#endif /** * Async notification about clocksource changes
Signature · 1 line
1.5.4.rc3