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