1 /* 2 * Uniprocessor-only support functions. The counterpart to kernel/smp.c 3 */ 4 5 #include <linux/interrupt.h> 6 #include <linux/kernel.h> 7 #include <linux/export.h> 8 #include <linux/smp.h> 9 10 int smp_call_function_single(int cpu, void (*func) (void *info), void *info, 11 int wait) 12 { 13 unsigned long flags; 14 15 WARN_ON(cpu != 0); 16 17 local_irq_save(flags); 18 func(info); 19 local_irq_restore(flags); 20 21 return 0; 22 } 23 EXPORT_SYMBOL(smp_call_function_single); 24 25 int on_each_cpu(smp_call_func_t func, void *info, int wait) 26 { 27 unsigned long flags; 28 29 local_irq_save(flags); 30 func(info); 31 local_irq_restore(flags); 32 return 0; 33 } 34 EXPORT_SYMBOL(on_each_cpu); 35 36 /* 37 * Note we still need to test the mask even for UP 38 * because we actually can get an empty mask from 39 * code that on SMP might call us without the local 40 * CPU in the mask. 41 */ 42 void on_each_cpu_mask(const struct cpumask *mask, 43 smp_call_func_t func, void *info, bool wait) 44 { 45 unsigned long flags; 46 47 if (cpumask_test_cpu(0, mask)) { 48 local_irq_save(flags); 49 func(info); 50 local_irq_restore(flags); 51 } 52 } 53 EXPORT_SYMBOL(on_each_cpu_mask); 54 55 /* 56 * Preemption is disabled here to make sure the cond_func is called under the 57 * same condtions in UP and SMP. 58 */ 59 void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info), 60 smp_call_func_t func, void *info, bool wait, 61 gfp_t gfp_flags) 62 { 63 unsigned long flags; 64 65 preempt_disable(); 66 if (cond_func(0, info)) { 67 local_irq_save(flags); 68 func(info); 69 local_irq_restore(flags); 70 } 71 preempt_enable(); 72 } 73 EXPORT_SYMBOL(on_each_cpu_cond); 74