xref: /openbmc/linux/kernel/up.c (revision fa688207)
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 	WARN_ON(cpu != 0);
14 
15 	local_irq_disable();
16 	(func)(info);
17 	local_irq_enable();
18 
19 	return 0;
20 }
21 EXPORT_SYMBOL(smp_call_function_single);
22 
23 /*
24  * Note we still need to test the mask even for UP
25  * because we actually can get an empty mask from
26  * code that on SMP might call us without the local
27  * CPU in the mask.
28  */
29 void on_each_cpu_mask(const struct cpumask *mask,
30 		      smp_call_func_t func, void *info, bool wait)
31 {
32 	unsigned long flags;
33 
34 	if (cpumask_test_cpu(0, mask)) {
35 		local_irq_save(flags);
36 		func(info);
37 		local_irq_restore(flags);
38 	}
39 }
40 EXPORT_SYMBOL(on_each_cpu_mask);
41 
42 /*
43  * Preemption is disabled here to make sure the cond_func is called under the
44  * same condtions in UP and SMP.
45  */
46 void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info),
47 		      smp_call_func_t func, void *info, bool wait,
48 		      gfp_t gfp_flags)
49 {
50 	unsigned long flags;
51 
52 	preempt_disable();
53 	if (cond_func(0, info)) {
54 		local_irq_save(flags);
55 		func(info);
56 		local_irq_restore(flags);
57 	}
58 	preempt_enable();
59 }
60 EXPORT_SYMBOL(on_each_cpu_cond);
61