From a52b1752c077cb919b71167c54968a0b91673281 Mon Sep 17 00:00:00 2001 From: Avi Kivity Date: Mon, 9 Jul 2007 17:11:49 +0300 Subject: SMP: Allow smp_call_function_single() to current cpu This removes the requirement for callers to get_cpu() to check in simple cases. This patch is for !CONFIG_SMP. Cc: Andi Kleen Signed-off-by: Avi Kivity --- include/linux/smp.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'include/linux/smp.h') diff --git a/include/linux/smp.h b/include/linux/smp.h index 96ac21f8dd73..8039daced688 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h @@ -7,6 +7,7 @@ */ #include +#include extern void cpu_idle(void); @@ -102,7 +103,11 @@ static inline void smp_send_reschedule(int cpu) { } static inline int smp_call_function_single(int cpuid, void (*func) (void *info), void *info, int retry, int wait) { - return -EBUSY; + WARN_ON(cpuid != 0); + local_irq_disable(); + func(info); + local_irq_enable(); + return 0; } #endif /* !SMP */ -- cgit v1.2.2 From 8dfd588c3180b7403c402b4545164ee4543f8f86 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Tue, 17 Jul 2007 22:29:46 +0100 Subject: smp_call_function_single() should be a macro on UP ... or we end up with header include order problems from hell. E.g. on m68k this is 100% fatal - local_irq_enable() there wants preempt_count(), which wants task_struct fields, which we won't have when we are in smp.h pulled from sched.h. Signed-off-by: Al Viro Signed-off-by: Linus Torvalds --- include/linux/smp.h | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'include/linux/smp.h') diff --git a/include/linux/smp.h b/include/linux/smp.h index 8039daced688..259a13c3bd98 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h @@ -7,7 +7,6 @@ */ #include -#include extern void cpu_idle(void); @@ -100,15 +99,14 @@ static inline int up_smp_call_function(void) static inline void smp_send_reschedule(int cpu) { } #define num_booting_cpus() 1 #define smp_prepare_boot_cpu() do {} while (0) -static inline int smp_call_function_single(int cpuid, void (*func) (void *info), - void *info, int retry, int wait) -{ - WARN_ON(cpuid != 0); - local_irq_disable(); - func(info); - local_irq_enable(); - return 0; -} +#define smp_call_function_single(cpuid, func, info, retry, wait) \ +({ \ + WARN_ON(cpuid != 0); \ + local_irq_disable(); \ + (func)(info); \ + local_irq_enable(); \ + 0; \ +}) #endif /* !SMP */ -- cgit v1.2.2