diff options
Diffstat (limited to 'kernel/up.c')
-rw-r--r-- | kernel/up.c | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/kernel/up.c b/kernel/up.c index c54c75e9faf7..630d72bf7e41 100644 --- a/kernel/up.c +++ b/kernel/up.c | |||
@@ -10,12 +10,64 @@ | |||
10 | int smp_call_function_single(int cpu, void (*func) (void *info), void *info, | 10 | int smp_call_function_single(int cpu, void (*func) (void *info), void *info, |
11 | int wait) | 11 | int wait) |
12 | { | 12 | { |
13 | unsigned long flags; | ||
14 | |||
13 | WARN_ON(cpu != 0); | 15 | WARN_ON(cpu != 0); |
14 | 16 | ||
15 | local_irq_disable(); | 17 | local_irq_save(flags); |
16 | (func)(info); | 18 | func(info); |
17 | local_irq_enable(); | 19 | local_irq_restore(flags); |
18 | 20 | ||
19 | return 0; | 21 | return 0; |
20 | } | 22 | } |
21 | EXPORT_SYMBOL(smp_call_function_single); | 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); | ||