From: Thomas Gleixner This function is intended to use by the freezer once the freezer folks solved their race issues. Also required to get rid of the ARM BL switcher tick hackery. Signed-off-by: Thomas Gleixner Cc: Nicolas Pitre Cc: Russell King --- include/linux/tick.h | 3 +++ kernel/time/tick-common.c | 18 +++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) Index: linux/include/linux/tick.h =================================================================== --- linux.orig/include/linux/tick.h +++ linux/include/linux/tick.h @@ -27,12 +27,15 @@ extern struct tick_device *tick_get_devi #ifdef CONFIG_GENERIC_CLOCKEVENTS extern void __init tick_init(void); +/* Should be core only, but arm BL switcher has its homebrewn implementation */ +extern void tick_suspend_local(void); /* Should be core only, but XEN resume magic requires this */ extern void tick_resume_local(void); /* CPU hotplug */ extern void tick_shutdown_local(void); #else /* CONFIG_GENERIC_CLOCKEVENTS */ static inline void tick_init(void) { } +static inline void tick_suspend_local(void) { } static inline void tick_resume_local(void) { } static inline void tick_shutdown_local(void) { } #endif /* !CONFIG_GENERIC_CLOCKEVENTS */ Index: linux/kernel/time/tick-common.c =================================================================== --- linux.orig/kernel/time/tick-common.c +++ linux/kernel/time/tick-common.c @@ -370,6 +370,20 @@ void tick_shutdown_local(void) #ifdef CONFIG_PM_SLEEP /** + * tick_suspend_local - Suspend the local tick device + * + * Called from the local cpu for freeze with interrupts disabled. + * + * No locks required. Nothing can change the per cpu device. + */ +void tick_suspend_local(void) +{ + struct tick_device *td = this_cpu_ptr(&tick_cpu_device); + + clockevents_shutdown(td->evtdev); +} + +/** * tick_suspend - Suspend the tick and the broadcast device * * Called from syscore_suspend() via timekeeping_suspend with only one @@ -379,9 +393,7 @@ void tick_shutdown_local(void) */ void tick_suspend(void) { - struct tick_device *td = this_cpu_ptr(&tick_cpu_device); - - clockevents_shutdown(td->evtdev); + tick_suspend_local(); tick_suspend_broadcast(); }