| Date | Mon, 16 Feb 2015 13:15:09 +0100 | From | Peter Zijlstra <> | Subject | [PATCH 34/35] tick: Provide tick_suspend_local() |
| |
From: Thomas Gleixner <tglx@linutronix.de>
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 <tglx@linutronix.de> Cc: Nicolas Pitre <nico@linaro.org> Cc: Russell King <rmk+kernel@arm.linux.org.uk>
--- 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(); }
|