1#ifndef __LINUX_CPUMASK_H
2#define __LINUX_CPUMASK_H
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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#include <linux/threads.h>
77#include <linux/bitmap.h>
78#include <asm/bug.h>
79
80typedef struct { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;
81extern cpumask_t _unused_cpumask_arg_;
82
83#define cpu_set(cpu, dst) __cpu_set((cpu), &(dst))
84static inline void __cpu_set(int cpu, volatile cpumask_t *dstp)
85{
86 set_bit(cpu, dstp->bits);
87}
88
89#define cpu_clear(cpu, dst) __cpu_clear((cpu), &(dst))
90static inline void __cpu_clear(int cpu, volatile cpumask_t *dstp)
91{
92 clear_bit(cpu, dstp->bits);
93}
94
95#define cpus_setall(dst) __cpus_setall(&(dst), NR_CPUS)
96static inline void __cpus_setall(cpumask_t *dstp, int nbits)
97{
98 bitmap_fill(dstp->bits, nbits);
99}
100
101#define cpus_clear(dst) __cpus_clear(&(dst), NR_CPUS)
102static inline void __cpus_clear(cpumask_t *dstp, int nbits)
103{
104 bitmap_zero(dstp->bits, nbits);
105}
106
107
108#define cpu_isset(cpu, cpumask) test_bit((cpu), (cpumask).bits)
109
110#define cpu_test_and_set(cpu, cpumask) __cpu_test_and_set((cpu), &(cpumask))
111static inline int __cpu_test_and_set(int cpu, cpumask_t *addr)
112{
113 return test_and_set_bit(cpu, addr->bits);
114}
115
116#define cpus_and(dst, src1, src2) __cpus_and(&(dst), &(src1), &(src2), NR_CPUS)
117static inline void __cpus_and(cpumask_t *dstp, const cpumask_t *src1p,
118 const cpumask_t *src2p, int nbits)
119{
120 bitmap_and(dstp->bits, src1p->bits, src2p->bits, nbits);
121}
122
123#define cpus_or(dst, src1, src2) __cpus_or(&(dst), &(src1), &(src2), NR_CPUS)
124static inline void __cpus_or(cpumask_t *dstp, const cpumask_t *src1p,
125 const cpumask_t *src2p, int nbits)
126{
127 bitmap_or(dstp->bits, src1p->bits, src2p->bits, nbits);
128}
129
130#define cpus_xor(dst, src1, src2) __cpus_xor(&(dst), &(src1), &(src2), NR_CPUS)
131static inline void __cpus_xor(cpumask_t *dstp, const cpumask_t *src1p,
132 const cpumask_t *src2p, int nbits)
133{
134 bitmap_xor(dstp->bits, src1p->bits, src2p->bits, nbits);
135}
136
137#define cpus_andnot(dst, src1, src2) \
138 __cpus_andnot(&(dst), &(src1), &(src2), NR_CPUS)
139static inline void __cpus_andnot(cpumask_t *dstp, const cpumask_t *src1p,
140 const cpumask_t *src2p, int nbits)
141{
142 bitmap_andnot(dstp->bits, src1p->bits, src2p->bits, nbits);
143}
144
145#define cpus_complement(dst, src) __cpus_complement(&(dst), &(src), NR_CPUS)
146static inline void __cpus_complement(cpumask_t *dstp,
147 const cpumask_t *srcp, int nbits)
148{
149 bitmap_complement(dstp->bits, srcp->bits, nbits);
150}
151
152#define cpus_equal(src1, src2) __cpus_equal(&(src1), &(src2), NR_CPUS)
153static inline int __cpus_equal(const cpumask_t *src1p,
154 const cpumask_t *src2p, int nbits)
155{
156 return bitmap_equal(src1p->bits, src2p->bits, nbits);
157}
158
159#define cpus_intersects(src1, src2) __cpus_intersects(&(src1), &(src2), NR_CPUS)
160static inline int __cpus_intersects(const cpumask_t *src1p,
161 const cpumask_t *src2p, int nbits)
162{
163 return bitmap_intersects(src1p->bits, src2p->bits, nbits);
164}
165
166#define cpus_subset(src1, src2) __cpus_subset(&(src1), &(src2), NR_CPUS)
167static inline int __cpus_subset(const cpumask_t *src1p,
168 const cpumask_t *src2p, int nbits)
169{
170 return bitmap_subset(src1p->bits, src2p->bits, nbits);
171}
172
173#define cpus_empty(src) __cpus_empty(&(src), NR_CPUS)
174static inline int __cpus_empty(const cpumask_t *srcp, int nbits)
175{
176 return bitmap_empty(srcp->bits, nbits);
177}
178
179#define cpus_full(cpumask) __cpus_full(&(cpumask), NR_CPUS)
180static inline int __cpus_full(const cpumask_t *srcp, int nbits)
181{
182 return bitmap_full(srcp->bits, nbits);
183}
184
185#define cpus_weight(cpumask) __cpus_weight(&(cpumask), NR_CPUS)
186static inline int __cpus_weight(const cpumask_t *srcp, int nbits)
187{
188 return bitmap_weight(srcp->bits, nbits);
189}
190
191#define cpus_shift_right(dst, src, n) \
192 __cpus_shift_right(&(dst), &(src), (n), NR_CPUS)
193static inline void __cpus_shift_right(cpumask_t *dstp,
194 const cpumask_t *srcp, int n, int nbits)
195{
196 bitmap_shift_right(dstp->bits, srcp->bits, n, nbits);
197}
198
199#define cpus_shift_left(dst, src, n) \
200 __cpus_shift_left(&(dst), &(src), (n), NR_CPUS)
201static inline void __cpus_shift_left(cpumask_t *dstp,
202 const cpumask_t *srcp, int n, int nbits)
203{
204 bitmap_shift_left(dstp->bits, srcp->bits, n, nbits);
205}
206
207#define first_cpu(src) __first_cpu(&(src), NR_CPUS)
208static inline int __first_cpu(const cpumask_t *srcp, int nbits)
209{
210 return find_first_bit(srcp->bits, nbits);
211}
212
213#define next_cpu(n, src) __next_cpu((n), &(src), NR_CPUS)
214static inline int __next_cpu(int n, const cpumask_t *srcp, int nbits)
215{
216 return find_next_bit(srcp->bits, nbits, n+1);
217}
218
219#define cpumask_of_cpu(cpu) \
220({ \
221 typeof(_unused_cpumask_arg_) m; \
222 if (sizeof(m) == sizeof(unsigned long)) { \
223 m.bits[0] = 1UL<<(cpu); \
224 } else { \
225 cpus_clear(m); \
226 cpu_set((cpu), m); \
227 } \
228 m; \
229})
230
231#define CPU_MASK_LAST_WORD BITMAP_LAST_WORD_MASK(NR_CPUS)
232
233#if NR_CPUS <= BITS_PER_LONG
234
235#define CPU_MASK_ALL \
236((cpumask_t) { { \
237 [BITS_TO_LONGS(NR_CPUS)-1] = CPU_MASK_LAST_WORD \
238} })
239
240#else
241
242#define CPU_MASK_ALL \
243((cpumask_t) { { \
244 [0 ... BITS_TO_LONGS(NR_CPUS)-2] = ~0UL, \
245 [BITS_TO_LONGS(NR_CPUS)-1] = CPU_MASK_LAST_WORD \
246} })
247
248#endif
249
250#define CPU_MASK_NONE \
251((cpumask_t) { { \
252 [0 ... BITS_TO_LONGS(NR_CPUS)-1] = 0UL \
253} })
254
255#define CPU_MASK_CPU0 \
256((cpumask_t) { { \
257 [0] = 1UL \
258} })
259
260#define cpus_addr(src) ((src).bits)
261
262#define cpumask_scnprintf(buf, len, src) \
263 __cpumask_scnprintf((buf), (len), &(src), NR_CPUS)
264static inline int __cpumask_scnprintf(char *buf, int len,
265 const cpumask_t *srcp, int nbits)
266{
267 return bitmap_scnprintf(buf, len, srcp->bits, nbits);
268}
269
270#define cpumask_parse(ubuf, ulen, src) \
271 __cpumask_parse((ubuf), (ulen), &(src), NR_CPUS)
272static inline int __cpumask_parse(const char __user *buf, int len,
273 cpumask_t *dstp, int nbits)
274{
275 return bitmap_parse(buf, len, dstp->bits, nbits);
276}
277
278#if NR_CPUS > 1
279#define for_each_cpu_mask(cpu, mask) \
280 for ((cpu) = first_cpu(mask); \
281 (cpu) < NR_CPUS; \
282 (cpu) = next_cpu((cpu), (mask)))
283#else
284#define for_each_cpu_mask(cpu, mask) for ((cpu) = 0; (cpu) < 1; (cpu)++)
285#endif
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343extern cpumask_t cpu_possible_map;
344extern cpumask_t cpu_online_map;
345extern cpumask_t cpu_present_map;
346
347#if NR_CPUS > 1
348#define num_online_cpus() cpus_weight(cpu_online_map)
349#define num_possible_cpus() cpus_weight(cpu_possible_map)
350#define num_present_cpus() cpus_weight(cpu_present_map)
351#define cpu_online(cpu) cpu_isset((cpu), cpu_online_map)
352#define cpu_possible(cpu) cpu_isset((cpu), cpu_possible_map)
353#define cpu_present(cpu) cpu_isset((cpu), cpu_present_map)
354#else
355#define num_online_cpus() 1
356#define num_possible_cpus() 1
357#define num_present_cpus() 1
358#define cpu_online(cpu) ((cpu) == 0)
359#define cpu_possible(cpu) ((cpu) == 0)
360#define cpu_present(cpu) ((cpu) == 0)
361#endif
362
363#define any_online_cpu(mask) \
364({ \
365 int cpu; \
366 for_each_cpu_mask(cpu, (mask)) \
367 if (cpu_online(cpu)) \
368 break; \
369 cpu; \
370})
371
372#define for_each_cpu(cpu) for_each_cpu_mask((cpu), cpu_possible_map)
373#define for_each_online_cpu(cpu) for_each_cpu_mask((cpu), cpu_online_map)
374#define for_each_present_cpu(cpu) for_each_cpu_mask((cpu), cpu_present_map)
375
376#endif
377