[PATCH 34/35] tick: Provide tick_suspend_local()

From: Peter Zijlstra
Date: Mon Feb 16 2015 - 08:11:52 EST


From: Thomas Gleixner <tglx@xxxxxxxxxxxxx>

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@xxxxxxxxxxxxx>
Cc: Nicolas Pitre <nico@xxxxxxxxxx>
Cc: Russell King <rmk+kernel@xxxxxxxxxxxxxxxx>

---
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();
}



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/