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