Add on_cpu_single Call a function on a target CPU but do the right thing when we're already on that CPU. That's the main difference from smp_call_function_single which does the wrong thing in this case (erroring out) Another advantage is that it is also defined for the UP case, avoiding some ifdefs. I also dropped retry (which never did anything) and wait (because the on current cpu case will always wait) Signed-off-by: Andi Kleen --- include/linux/smp.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) Index: linux/include/linux/smp.h =================================================================== --- linux.orig/include/linux/smp.h +++ linux/include/linux/smp.h @@ -135,4 +135,26 @@ static inline int smp_call_function_sing void smp_setup_processor_id(void); +#ifdef CONFIG_SMP +/* Similar to smp_call_function_single, but DTRT when we're already + on the right CPU. */ +static inline void on_cpu_single(int cpu, void (*func)(void *), void *info) +{ + int me = get_cpu(); + if (cpu == me) { + func(info); + put_cpu(); + } else { + put_cpu(); + /* wait is forced on because the me==cpu case above will always wait */ + smp_call_function_single(cpu, func, info, 0, 1); + } +} +#else +static inline void on_cpu_single(int cpu, void (*func)(void *), void *info) +{ + func(info); +} +#endif + #endif /* __LINUX_SMP_H */