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