1
2#ifndef __LINUX_SMP_H
3#define __LINUX_SMP_H
4
5
6
7
8
9
10#include <linux/errno.h>
11#include <linux/types.h>
12#include <linux/list.h>
13#include <linux/cpumask.h>
14#include <linux/init.h>
15#include <linux/smp_types.h>
16
17typedef void (*smp_call_func_t)(void *info);
18typedef bool (*smp_cond_func_t)(int cpu, void *info);
19
20
21
22
23struct __call_single_data {
24 union {
25 struct __call_single_node node;
26 struct {
27 struct llist_node llist;
28 unsigned int flags;
29#ifdef CONFIG_64BIT
30 u16 src, dst;
31#endif
32 };
33 };
34 smp_call_func_t func;
35 void *info;
36};
37
38
39typedef struct __call_single_data call_single_data_t
40 __aligned(sizeof(struct __call_single_data));
41
42
43
44
45
46extern void __smp_call_single_queue(int cpu, struct llist_node *node);
47
48
49extern unsigned int total_cpus;
50
51int smp_call_function_single(int cpuid, smp_call_func_t func, void *info,
52 int wait);
53
54
55
56
57void on_each_cpu(smp_call_func_t func, void *info, int wait);
58
59
60
61
62
63void on_each_cpu_mask(const struct cpumask *mask, smp_call_func_t func,
64 void *info, bool wait);
65
66
67
68
69
70
71void on_each_cpu_cond(smp_cond_func_t cond_func, smp_call_func_t func,
72 void *info, bool wait);
73
74void on_each_cpu_cond_mask(smp_cond_func_t cond_func, smp_call_func_t func,
75 void *info, bool wait, const struct cpumask *mask);
76
77int smp_call_function_single_async(int cpu, call_single_data_t *csd);
78
79#ifdef CONFIG_SMP
80
81#include <linux/preempt.h>
82#include <linux/kernel.h>
83#include <linux/compiler.h>
84#include <linux/thread_info.h>
85#include <asm/smp.h>
86
87
88
89
90
91
92
93
94
95extern void smp_send_stop(void);
96
97
98
99
100extern void smp_send_reschedule(int cpu);
101
102
103
104
105
106extern void smp_prepare_cpus(unsigned int max_cpus);
107
108
109
110
111extern int __cpu_up(unsigned int cpunum, struct task_struct *tidle);
112
113
114
115
116extern void smp_cpus_done(unsigned int max_cpus);
117
118
119
120
121void smp_call_function(smp_call_func_t func, void *info, int wait);
122void smp_call_function_many(const struct cpumask *mask,
123 smp_call_func_t func, void *info, bool wait);
124
125int smp_call_function_any(const struct cpumask *mask,
126 smp_call_func_t func, void *info, int wait);
127
128void kick_all_cpus_sync(void);
129void wake_up_all_idle_cpus(void);
130
131
132
133
134void __init call_function_init(void);
135void generic_smp_call_function_single_interrupt(void);
136#define generic_smp_call_function_interrupt \
137 generic_smp_call_function_single_interrupt
138
139
140
141
142
143void smp_prepare_boot_cpu(void);
144
145extern unsigned int setup_max_cpus;
146extern void __init setup_nr_cpu_ids(void);
147extern void __init smp_init(void);
148
149extern int __boot_cpu_id;
150
151static inline int get_boot_cpu_id(void)
152{
153 return __boot_cpu_id;
154}
155
156#else
157
158static inline void smp_send_stop(void) { }
159
160
161
162
163#define raw_smp_processor_id() 0
164static inline void up_smp_call_function(smp_call_func_t func, void *info)
165{
166}
167#define smp_call_function(func, info, wait) \
168 (up_smp_call_function(func, info))
169
170static inline void smp_send_reschedule(int cpu) { }
171#define smp_prepare_boot_cpu() do {} while (0)
172#define smp_call_function_many(mask, func, info, wait) \
173 (up_smp_call_function(func, info))
174static inline void call_function_init(void) { }
175
176static inline int
177smp_call_function_any(const struct cpumask *mask, smp_call_func_t func,
178 void *info, int wait)
179{
180 return smp_call_function_single(0, func, info, wait);
181}
182
183static inline void kick_all_cpus_sync(void) { }
184static inline void wake_up_all_idle_cpus(void) { }
185
186#ifdef CONFIG_UP_LATE_INIT
187extern void __init up_late_init(void);
188static inline void smp_init(void) { up_late_init(); }
189#else
190static inline void smp_init(void) { }
191#endif
192
193static inline int get_boot_cpu_id(void)
194{
195 return 0;
196}
197
198#endif
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228#ifndef __smp_processor_id
229#define __smp_processor_id(x) raw_smp_processor_id(x)
230#endif
231
232#ifdef CONFIG_DEBUG_PREEMPT
233 extern unsigned int debug_smp_processor_id(void);
234# define smp_processor_id() debug_smp_processor_id()
235#else
236# define smp_processor_id() __smp_processor_id()
237#endif
238
239#define get_cpu() ({ preempt_disable(); __smp_processor_id(); })
240#define put_cpu() preempt_enable()
241
242
243
244
245
246extern void arch_disable_smp_support(void);
247
248extern void arch_thaw_secondary_cpus_begin(void);
249extern void arch_thaw_secondary_cpus_end(void);
250
251void smp_setup_processor_id(void);
252
253int smp_call_on_cpu(unsigned int cpu, int (*func)(void *), void *par,
254 bool phys);
255
256
257int smpcfd_prepare_cpu(unsigned int cpu);
258int smpcfd_dead_cpu(unsigned int cpu);
259int smpcfd_dying_cpu(unsigned int cpu);
260
261#endif
262