Blame view
kernel/up.c
1.5 KB
457c89965
|
1 |
// SPDX-License-Identifier: GPL-2.0-only |
53ce3d956
|
2 3 4 |
/* * Uniprocessor-only support functions. The counterpart to kernel/smp.c */ |
6e9628141
|
5 |
#include <linux/interrupt.h> |
53ce3d956
|
6 |
#include <linux/kernel.h> |
9984de1a5
|
7 |
#include <linux/export.h> |
53ce3d956
|
8 |
#include <linux/smp.h> |
47ae4b05d
|
9 |
#include <linux/hypervisor.h> |
53ce3d956
|
10 11 12 13 |
int smp_call_function_single(int cpu, void (*func) (void *info), void *info, int wait) { |
081192b25
|
14 |
unsigned long flags; |
1e474b28e
|
15 16 |
if (cpu != 0) return -ENXIO; |
93423b866
|
17 |
|
081192b25
|
18 19 20 |
local_irq_save(flags); func(info); local_irq_restore(flags); |
93423b866
|
21 |
|
53ce3d956
|
22 23 24 |
return 0; } EXPORT_SYMBOL(smp_call_function_single); |
fa688207c
|
25 |
|
1139aeb1c
|
26 |
int smp_call_function_single_async(int cpu, struct __call_single_data *csd) |
40c01e8bd
|
27 28 29 30 31 32 |
{ unsigned long flags; local_irq_save(flags); csd->func(csd->info); local_irq_restore(flags); |
08eed44c7
|
33 |
return 0; |
40c01e8bd
|
34 |
} |
c46fff2a3
|
35 |
EXPORT_SYMBOL(smp_call_function_single_async); |
40c01e8bd
|
36 |
|
fa688207c
|
37 38 |
/* * Preemption is disabled here to make sure the cond_func is called under the |
f0fffaff0
|
39 |
* same conditions in UP and SMP. |
fa688207c
|
40 |
*/ |
5671d814d
|
41 |
void on_each_cpu_cond_mask(smp_cond_func_t cond_func, smp_call_func_t func, |
cb923159b
|
42 |
void *info, bool wait, const struct cpumask *mask) |
fa688207c
|
43 44 45 46 |
{ unsigned long flags; preempt_disable(); |
a5aa5ce30
|
47 |
if ((!cond_func || cond_func(0, info)) && cpumask_test_cpu(0, mask)) { |
fa688207c
|
48 49 50 51 52 53 |
local_irq_save(flags); func(info); local_irq_restore(flags); } preempt_enable(); } |
7d49b28a8
|
54 |
EXPORT_SYMBOL(on_each_cpu_cond_mask); |
df8ce9d78
|
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
int smp_call_on_cpu(unsigned int cpu, int (*func)(void *), void *par, bool phys) { int ret; if (cpu != 0) return -ENXIO; if (phys) hypervisor_pin_vcpu(0); ret = func(par); if (phys) hypervisor_pin_vcpu(-1); return ret; } EXPORT_SYMBOL_GPL(smp_call_on_cpu); |