]> Pileus Git - ~andy/linux/commitdiff
smp: Implement kick_all_cpus_sync()
authorThomas Gleixner <tglx@linutronix.de>
Mon, 7 May 2012 17:59:48 +0000 (17:59 +0000)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 8 May 2012 10:35:06 +0000 (12:35 +0200)
Will replace the misnomed cpu_idle_wait() function which is copied a
gazillion times all over arch/*

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20120507175652.049316594@linutronix.de
include/linux/smp.h
kernel/smp.c

index 24360de6c968ae0127df8a21a2cc6b46c1e20cee..717fb746c9a822ce1098870b17b706c184cfdeb7 100644 (file)
@@ -81,6 +81,8 @@ void __smp_call_function_single(int cpuid, struct call_single_data *data,
 int smp_call_function_any(const struct cpumask *mask,
                          smp_call_func_t func, void *info, int wait);
 
+void kick_all_cpus_sync(void);
+
 /*
  * Generic and arch helpers
  */
@@ -192,6 +194,8 @@ smp_call_function_any(const struct cpumask *mask, smp_call_func_t func,
        return smp_call_function_single(0, func, info, wait);
 }
 
+static inline void kick_all_cpus_sync(void) {  }
+
 #endif /* !SMP */
 
 /*
index a61294c07f3f005aa041721b9f2b83e3026a81bf..d0ae5b24875e0f73659d79ae6cd3f9ee11d5ab41 100644 (file)
@@ -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);