|
@@ -795,3 +795,26 @@ void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info),
|
|
|
}
|
|
|
}
|
|
|
EXPORT_SYMBOL(on_each_cpu_cond);
|
|
|
+
|
|
|
+static void do_nothing(void *unused)
|
|
|
+{
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * kick_all_cpus_sync - Force all cpus out of idle
|
|
|
+ *
|
|
|
+ * Used to synchronize the update of pm_idle function pointer. It's
|
|
|
+ * called after the pointer is updated and returns after the dummy
|
|
|
+ * callback function has been executed on all cpus. The execution of
|
|
|
+ * the function can only happen on the remote cpus after they have
|
|
|
+ * left the idle function which had been called via pm_idle function
|
|
|
+ * pointer. So it's guaranteed that nothing uses the previous pointer
|
|
|
+ * anymore.
|
|
|
+ */
|
|
|
+void kick_all_cpus_sync(void)
|
|
|
+{
|
|
|
+ /* Make sure the change is visible before we kick the cpus */
|
|
|
+ smp_mb();
|
|
|
+ smp_call_function(do_nothing, NULL, 1);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(kick_all_cpus_sync);
|