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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137#include <linux/kernel.h>
138#include <linux/threads.h>
139#include <linux/bitmap.h>
140
141typedef struct { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;
142extern cpumask_t _unused_cpumask_arg_;
143
144#define cpu_set(cpu, dst) __cpu_set((cpu), &(dst))
145static inline void __cpu_set(int cpu, volatile cpumask_t *dstp)
146{
147 set_bit(cpu, dstp->bits);
148}
149
150#define cpu_clear(cpu, dst) __cpu_clear((cpu), &(dst))
151static inline void __cpu_clear(int cpu, volatile cpumask_t *dstp)
152{
153 clear_bit(cpu, dstp->bits);
154}
155
156#define cpus_setall(dst) __cpus_setall(&(dst), NR_CPUS)
157static inline void __cpus_setall(cpumask_t *dstp, int nbits)
158{
159 bitmap_fill(dstp->bits, nbits);
160}
161
162#define cpus_clear(dst) __cpus_clear(&(dst), NR_CPUS)
163static inline void __cpus_clear(cpumask_t *dstp, int nbits)
164{
165 bitmap_zero(dstp->bits, nbits);
166}
167
168
169#define cpu_isset(cpu, cpumask) test_bit((cpu), (cpumask).bits)
170
171#define cpu_test_and_set(cpu, cpumask) __cpu_test_and_set((cpu), &(cpumask))
172static inline int __cpu_test_and_set(int cpu, cpumask_t *addr)
173{
174 return test_and_set_bit(cpu, addr->bits);
175}
176
177#define cpus_and(dst, src1, src2) __cpus_and(&(dst), &(src1), &(src2), NR_CPUS)
178static inline void __cpus_and(cpumask_t *dstp, const cpumask_t *src1p,
179 const cpumask_t *src2p, int nbits)
180{
181 bitmap_and(dstp->bits, src1p->bits, src2p->bits, nbits);
182}
183
184#define cpus_or(dst, src1, src2) __cpus_or(&(dst), &(src1), &(src2), NR_CPUS)
185static inline void __cpus_or(cpumask_t *dstp, const cpumask_t *src1p,
186 const cpumask_t *src2p, int nbits)
187{
188 bitmap_or(dstp->bits, src1p->bits, src2p->bits, nbits);
189}
190
191#define cpus_xor(dst, src1, src2) __cpus_xor(&(dst), &(src1), &(src2), NR_CPUS)
192static inline void __cpus_xor(cpumask_t *dstp, const cpumask_t *src1p,
193 const cpumask_t *src2p, int nbits)
194{
195 bitmap_xor(dstp->bits, src1p->bits, src2p->bits, nbits);
196}
197
198#define cpus_andnot(dst, src1, src2) \
199 __cpus_andnot(&(dst), &(src1), &(src2), NR_CPUS)
200static inline void __cpus_andnot(cpumask_t *dstp, const cpumask_t *src1p,
201 const cpumask_t *src2p, int nbits)
202{
203 bitmap_andnot(dstp->bits, src1p->bits, src2p->bits, nbits);
204}
205
206#define cpus_complement(dst, src) __cpus_complement(&(dst), &(src), NR_CPUS)
207static inline void __cpus_complement(cpumask_t *dstp,
208 const cpumask_t *srcp, int nbits)
209{
210 bitmap_complement(dstp->bits, srcp->bits, nbits);
211}
212
213#define cpus_equal(src1, src2) __cpus_equal(&(src1), &(src2), NR_CPUS)
214static inline int __cpus_equal(const cpumask_t *src1p,
215 const cpumask_t *src2p, int nbits)
216{
217 return bitmap_equal(src1p->bits, src2p->bits, nbits);
218}
219
220#define cpus_intersects(src1, src2) __cpus_intersects(&(src1), &(src2), NR_CPUS)
221static inline int __cpus_intersects(const cpumask_t *src1p,
222 const cpumask_t *src2p, int nbits)
223{
224 return bitmap_intersects(src1p->bits, src2p->bits, nbits);
225}
226
227#define cpus_subset(src1, src2) __cpus_subset(&(src1), &(src2), NR_CPUS)
228static inline int __cpus_subset(const cpumask_t *src1p,
229 const cpumask_t *src2p, int nbits)
230{
231 return bitmap_subset(src1p->bits, src2p->bits, nbits);
232}
233
234#define cpus_empty(src) __cpus_empty(&(src), NR_CPUS)
235static inline int __cpus_empty(const cpumask_t *srcp, int nbits)
236{
237 return bitmap_empty(srcp->bits, nbits);
238}
239
240#define cpus_full(cpumask) __cpus_full(&(cpumask), NR_CPUS)
241static inline int __cpus_full(const cpumask_t *srcp, int nbits)
242{
243 return bitmap_full(srcp->bits, nbits);
244}
245
246#define cpus_weight(cpumask) __cpus_weight(&(cpumask), NR_CPUS)
247static inline int __cpus_weight(const cpumask_t *srcp, int nbits)
248{
249 return bitmap_weight(srcp->bits, nbits);
250}
251
252#define cpus_shift_right(dst, src, n) \
253 __cpus_shift_right(&(dst), &(src), (n), NR_CPUS)
254static inline void __cpus_shift_right(cpumask_t *dstp,
255 const cpumask_t *srcp, int n, int nbits)
256{
257 bitmap_shift_right(dstp->bits, srcp->bits, n, nbits);
258}
259
260#define cpus_shift_left(dst, src, n) \
261 __cpus_shift_left(&(dst), &(src), (n), NR_CPUS)
262static inline void __cpus_shift_left(cpumask_t *dstp,
263 const cpumask_t *srcp, int n, int nbits)
264{
265 bitmap_shift_left(dstp->bits, srcp->bits, n, nbits);
266}
267
268
269
270
271
272
273
274
275extern const unsigned long
276 cpu_bit_bitmap[BITS_PER_LONG+1][BITS_TO_LONGS(NR_CPUS)];
277
278static inline const cpumask_t *get_cpu_mask(unsigned int cpu)
279{
280 const unsigned long *p = cpu_bit_bitmap[1 + cpu % BITS_PER_LONG];
281 p -= cpu / BITS_PER_LONG;
282 return (const cpumask_t *)p;
283}
284
285
286
287
288
289
290#define cpumask_of_cpu(cpu) (*get_cpu_mask(cpu))
291
292
293#define CPU_MASK_LAST_WORD BITMAP_LAST_WORD_MASK(NR_CPUS)
294
295#if NR_CPUS <= BITS_PER_LONG
296
297#define CPU_MASK_ALL \
298(cpumask_t) { { \
299 [BITS_TO_LONGS(NR_CPUS)-1] = CPU_MASK_LAST_WORD \
300} }
301
302#define CPU_MASK_ALL_PTR (&CPU_MASK_ALL)
303
304#else
305
306#define CPU_MASK_ALL \
307(cpumask_t) { { \
308 [0 ... BITS_TO_LONGS(NR_CPUS)-2] = ~0UL, \
309 [BITS_TO_LONGS(NR_CPUS)-1] = CPU_MASK_LAST_WORD \
310} }
311
312
313extern cpumask_t cpu_mask_all;
314#define CPU_MASK_ALL_PTR (&cpu_mask_all)
315
316#endif
317
318#define CPU_MASK_NONE \
319(cpumask_t) { { \
320 [0 ... BITS_TO_LONGS(NR_CPUS)-1] = 0UL \
321} }
322
323#define CPU_MASK_CPU0 \
324(cpumask_t) { { \
325 [0] = 1UL \
326} }
327
328#define cpus_addr(src) ((src).bits)
329
330#if NR_CPUS > BITS_PER_LONG
331#define CPUMASK_ALLOC(m) struct m *m = kmalloc(sizeof(*m), GFP_KERNEL)
332#define CPUMASK_FREE(m) kfree(m)
333#else
334#define CPUMASK_ALLOC(m) struct m _m, *m = &_m
335#define CPUMASK_FREE(m)
336#endif
337#define CPUMASK_PTR(v, m) cpumask_t *v = &(m->v)
338
339#define cpumask_scnprintf(buf, len, src) \
340 __cpumask_scnprintf((buf), (len), &(src), NR_CPUS)
341static inline int __cpumask_scnprintf(char *buf, int len,
342 const cpumask_t *srcp, int nbits)
343{
344 return bitmap_scnprintf(buf, len, srcp->bits, nbits);
345}
346
347#define cpumask_parse_user(ubuf, ulen, dst) \
348 __cpumask_parse_user((ubuf), (ulen), &(dst), NR_CPUS)
349static inline int __cpumask_parse_user(const char __user *buf, int len,
350 cpumask_t *dstp, int nbits)
351{
352 return bitmap_parse_user(buf, len, dstp->bits, nbits);
353}
354
355#define cpulist_scnprintf(buf, len, src) \
356 __cpulist_scnprintf((buf), (len), &(src), NR_CPUS)
357static inline int __cpulist_scnprintf(char *buf, int len,
358 const cpumask_t *srcp, int nbits)
359{
360 return bitmap_scnlistprintf(buf, len, srcp->bits, nbits);
361}
362
363#define cpulist_parse(buf, dst) __cpulist_parse((buf), &(dst), NR_CPUS)
364static inline int __cpulist_parse(const char *buf, cpumask_t *dstp, int nbits)
365{
366 return bitmap_parselist(buf, dstp->bits, nbits);
367}
368
369#define cpu_remap(oldbit, old, new) \
370 __cpu_remap((oldbit), &(old), &(new), NR_CPUS)
371static inline int __cpu_remap(int oldbit,
372 const cpumask_t *oldp, const cpumask_t *newp, int nbits)
373{
374 return bitmap_bitremap(oldbit, oldp->bits, newp->bits, nbits);
375}
376
377#define cpus_remap(dst, src, old, new) \
378 __cpus_remap(&(dst), &(src), &(old), &(new), NR_CPUS)
379static inline void __cpus_remap(cpumask_t *dstp, const cpumask_t *srcp,
380 const cpumask_t *oldp, const cpumask_t *newp, int nbits)
381{
382 bitmap_remap(dstp->bits, srcp->bits, oldp->bits, newp->bits, nbits);
383}
384
385#define cpus_onto(dst, orig, relmap) \
386 __cpus_onto(&(dst), &(orig), &(relmap), NR_CPUS)
387static inline void __cpus_onto(cpumask_t *dstp, const cpumask_t *origp,
388 const cpumask_t *relmapp, int nbits)
389{
390 bitmap_onto(dstp->bits, origp->bits, relmapp->bits, nbits);
391}
392
393#define cpus_fold(dst, orig, sz) \
394 __cpus_fold(&(dst), &(orig), sz, NR_CPUS)
395static inline void __cpus_fold(cpumask_t *dstp, const cpumask_t *origp,
396 int sz, int nbits)
397{
398 bitmap_fold(dstp->bits, origp->bits, sz, nbits);
399}
400
401#if NR_CPUS == 1
402
403#define nr_cpu_ids 1
404#define first_cpu(src) ({ (void)(src); 0; })
405#define next_cpu(n, src) ({ (void)(src); 1; })
406#define any_online_cpu(mask) 0
407#define for_each_cpu_mask(cpu, mask) \
408 for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask)
409
410#else
411
412extern int nr_cpu_ids;
413int __first_cpu(const cpumask_t *srcp);
414int __next_cpu(int n, const cpumask_t *srcp);
415int __any_online_cpu(const cpumask_t *mask);
416
417#define first_cpu(src) __first_cpu(&(src))
418#define next_cpu(n, src) __next_cpu((n), &(src))
419#define any_online_cpu(mask) __any_online_cpu(&(mask))
420#define for_each_cpu_mask(cpu, mask) \
421 for ((cpu) = -1; \
422 (cpu) = next_cpu((cpu), (mask)), \
423 (cpu) < NR_CPUS; )
424#endif
425
426#if NR_CPUS <= 64
427
428#define next_cpu_nr(n, src) next_cpu(n, src)
429#define cpus_weight_nr(cpumask) cpus_weight(cpumask)
430#define for_each_cpu_mask_nr(cpu, mask) for_each_cpu_mask(cpu, mask)
431
432#else
433
434int __next_cpu_nr(int n, const cpumask_t *srcp);
435#define next_cpu_nr(n, src) __next_cpu_nr((n), &(src))
436#define cpus_weight_nr(cpumask) __cpus_weight(&(cpumask), nr_cpu_ids)
437#define for_each_cpu_mask_nr(cpu, mask) \
438 for ((cpu) = -1; \
439 (cpu) = next_cpu_nr((cpu), (mask)), \
440 (cpu) < nr_cpu_ids; )
441
442#endif
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501extern cpumask_t cpu_possible_map;
502extern cpumask_t cpu_online_map;
503extern cpumask_t cpu_present_map;
504extern cpumask_t cpu_active_map;
505
506#if NR_CPUS > 1
507#define num_online_cpus() cpus_weight_nr(cpu_online_map)
508#define num_possible_cpus() cpus_weight_nr(cpu_possible_map)
509#define num_present_cpus() cpus_weight_nr(cpu_present_map)
510#define cpu_online(cpu) cpu_isset((cpu), cpu_online_map)
511#define cpu_possible(cpu) cpu_isset((cpu), cpu_possible_map)
512#define cpu_present(cpu) cpu_isset((cpu), cpu_present_map)
513#define cpu_active(cpu) cpu_isset((cpu), cpu_active_map)
514#else
515#define num_online_cpus() 1
516#define num_possible_cpus() 1
517#define num_present_cpus() 1
518#define cpu_online(cpu) ((cpu) == 0)
519#define cpu_possible(cpu) ((cpu) == 0)
520#define cpu_present(cpu) ((cpu) == 0)
521#define cpu_active(cpu) ((cpu) == 0)
522#endif
523
524#define cpu_is_offline(cpu) unlikely(!cpu_online(cpu))
525
526#define for_each_possible_cpu(cpu) for_each_cpu_mask_nr((cpu), cpu_possible_map)
527#define for_each_online_cpu(cpu) for_each_cpu_mask_nr((cpu), cpu_online_map)
528#define for_each_present_cpu(cpu) for_each_cpu_mask_nr((cpu), cpu_present_map)
529
530#endif
531