Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

smp: Implement kick_all_cpus_sync()

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

+27
+4
include/linux/smp.h
··· 81 81 int smp_call_function_any(const struct cpumask *mask, 82 82 smp_call_func_t func, void *info, int wait); 83 83 84 + void kick_all_cpus_sync(void); 85 + 84 86 /* 85 87 * Generic and arch helpers 86 88 */ ··· 193 191 { 194 192 return smp_call_function_single(0, func, info, wait); 195 193 } 194 + 195 + static inline void kick_all_cpus_sync(void) { } 196 196 197 197 #endif /* !SMP */ 198 198
+23
kernel/smp.c
··· 795 795 } 796 796 } 797 797 EXPORT_SYMBOL(on_each_cpu_cond); 798 + 799 + static void do_nothing(void *unused) 800 + { 801 + } 802 + 803 + /** 804 + * kick_all_cpus_sync - Force all cpus out of idle 805 + * 806 + * Used to synchronize the update of pm_idle function pointer. It's 807 + * called after the pointer is updated and returns after the dummy 808 + * callback function has been executed on all cpus. The execution of 809 + * the function can only happen on the remote cpus after they have 810 + * left the idle function which had been called via pm_idle function 811 + * pointer. So it's guaranteed that nothing uses the previous pointer 812 + * anymore. 813 + */ 814 + void kick_all_cpus_sync(void) 815 + { 816 + /* Make sure the change is visible before we kick the cpus */ 817 + smp_mb(); 818 + smp_call_function(do_nothing, NULL, 1); 819 + } 820 + EXPORT_SYMBOL_GPL(kick_all_cpus_sync);