1#ifndef __LINUX_CPUMASK_H
2#define __LINUX_CPUMASK_H
3
4
5
6
7
8
9#include <linux/kernel.h>
10#include <linux/threads.h>
11#include <linux/bitmap.h>
12#include <linux/bug.h>
13
14
15typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;
16
17
18
19
20
21
22
23
24#define cpumask_bits(maskp) ((maskp)->bits)
25
26
27
28
29
30
31
32#define cpumask_pr_args(maskp) nr_cpu_ids, cpumask_bits(maskp)
33
34#if NR_CPUS == 1
35#define nr_cpu_ids 1
36#else
37extern int nr_cpu_ids;
38#endif
39
40#ifdef CONFIG_CPUMASK_OFFSTACK
41
42
43#define nr_cpumask_bits nr_cpu_ids
44#else
45#define nr_cpumask_bits NR_CPUS
46#endif
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
88extern const struct cpumask *const cpu_possible_mask;
89extern const struct cpumask *const cpu_online_mask;
90extern const struct cpumask *const cpu_present_mask;
91extern const struct cpumask *const cpu_active_mask;
92
93#if NR_CPUS > 1
94#define num_online_cpus() cpumask_weight(cpu_online_mask)
95#define num_possible_cpus() cpumask_weight(cpu_possible_mask)
96#define num_present_cpus() cpumask_weight(cpu_present_mask)
97#define num_active_cpus() cpumask_weight(cpu_active_mask)
98#define cpu_online(cpu) cpumask_test_cpu((cpu), cpu_online_mask)
99#define cpu_possible(cpu) cpumask_test_cpu((cpu), cpu_possible_mask)
100#define cpu_present(cpu) cpumask_test_cpu((cpu), cpu_present_mask)
101#define cpu_active(cpu) cpumask_test_cpu((cpu), cpu_active_mask)
102#else
103#define num_online_cpus() 1U
104#define num_possible_cpus() 1U
105#define num_present_cpus() 1U
106#define num_active_cpus() 1U
107#define cpu_online(cpu) ((cpu) == 0)
108#define cpu_possible(cpu) ((cpu) == 0)
109#define cpu_present(cpu) ((cpu) == 0)
110#define cpu_active(cpu) ((cpu) == 0)
111#endif
112
113
114static inline unsigned int cpumask_check(unsigned int cpu)
115{
116#ifdef CONFIG_DEBUG_PER_CPU_MAPS
117 WARN_ON_ONCE(cpu >= nr_cpumask_bits);
118#endif
119 return cpu;
120}
121
122#if NR_CPUS == 1
123
124static inline unsigned int cpumask_first(const struct cpumask *srcp)
125{
126 return 0;
127}
128
129
130static inline unsigned int cpumask_next(int n, const struct cpumask *srcp)
131{
132 return n+1;
133}
134
135static inline unsigned int cpumask_next_zero(int n, const struct cpumask *srcp)
136{
137 return n+1;
138}
139
140static inline unsigned int cpumask_next_and(int n,
141 const struct cpumask *srcp,
142 const struct cpumask *andp)
143{
144 return n+1;
145}
146
147
148static inline unsigned int cpumask_any_but(const struct cpumask *mask,
149 unsigned int cpu)
150{
151 return 1;
152}
153
154static inline unsigned int cpumask_local_spread(unsigned int i, int node)
155{
156 return 0;
157}
158
159#define for_each_cpu(cpu, mask) \
160 for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask)
161#define for_each_cpu_not(cpu, mask) \
162 for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask)
163#define for_each_cpu_and(cpu, mask, and) \
164 for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask, (void)and)
165#else
166
167
168
169
170
171
172static inline unsigned int cpumask_first(const struct cpumask *srcp)
173{
174 return find_first_bit(cpumask_bits(srcp), nr_cpumask_bits);
175}
176
177
178
179
180
181
182
183
184static inline unsigned int cpumask_next(int n, const struct cpumask *srcp)
185{
186
187 if (n != -1)
188 cpumask_check(n);
189 return find_next_bit(cpumask_bits(srcp), nr_cpumask_bits, n+1);
190}
191
192
193
194
195
196
197
198
199static inline unsigned int cpumask_next_zero(int n, const struct cpumask *srcp)
200{
201
202 if (n != -1)
203 cpumask_check(n);
204 return find_next_zero_bit(cpumask_bits(srcp), nr_cpumask_bits, n+1);
205}
206
207int cpumask_next_and(int n, const struct cpumask *, const struct cpumask *);
208int cpumask_any_but(const struct cpumask *mask, unsigned int cpu);
209unsigned int cpumask_local_spread(unsigned int i, int node);
210
211
212
213
214
215
216
217
218#define for_each_cpu(cpu, mask) \
219 for ((cpu) = -1; \
220 (cpu) = cpumask_next((cpu), (mask)), \
221 (cpu) < nr_cpu_ids;)
222
223
224
225
226
227
228
229
230#define for_each_cpu_not(cpu, mask) \
231 for ((cpu) = -1; \
232 (cpu) = cpumask_next_zero((cpu), (mask)), \
233 (cpu) < nr_cpu_ids;)
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249#define for_each_cpu_and(cpu, mask, and) \
250 for ((cpu) = -1; \
251 (cpu) = cpumask_next_and((cpu), (mask), (and)), \
252 (cpu) < nr_cpu_ids;)
253#endif
254
255#define CPU_BITS_NONE \
256{ \
257 [0 ... BITS_TO_LONGS(NR_CPUS)-1] = 0UL \
258}
259
260#define CPU_BITS_CPU0 \
261{ \
262 [0] = 1UL \
263}
264
265
266
267
268
269
270static inline void cpumask_set_cpu(unsigned int cpu, struct cpumask *dstp)
271{
272 set_bit(cpumask_check(cpu), cpumask_bits(dstp));
273}
274
275
276
277
278
279
280static inline void cpumask_clear_cpu(int cpu, struct cpumask *dstp)
281{
282 clear_bit(cpumask_check(cpu), cpumask_bits(dstp));
283}
284
285
286
287
288
289
290
291
292static inline int cpumask_test_cpu(int cpu, const struct cpumask *cpumask)
293{
294 return test_bit(cpumask_check(cpu), cpumask_bits((cpumask)));
295}
296
297
298
299
300
301
302
303
304
305
306static inline int cpumask_test_and_set_cpu(int cpu, struct cpumask *cpumask)
307{
308 return test_and_set_bit(cpumask_check(cpu), cpumask_bits(cpumask));
309}
310
311
312
313
314
315
316
317
318
319
320static inline int cpumask_test_and_clear_cpu(int cpu, struct cpumask *cpumask)
321{
322 return test_and_clear_bit(cpumask_check(cpu), cpumask_bits(cpumask));
323}
324
325
326
327
328
329static inline void cpumask_setall(struct cpumask *dstp)
330{
331 bitmap_fill(cpumask_bits(dstp), nr_cpumask_bits);
332}
333
334
335
336
337
338static inline void cpumask_clear(struct cpumask *dstp)
339{
340 bitmap_zero(cpumask_bits(dstp), nr_cpumask_bits);
341}
342
343
344
345
346
347
348
349
350
351static inline int cpumask_and(struct cpumask *dstp,
352 const struct cpumask *src1p,
353 const struct cpumask *src2p)
354{
355 return bitmap_and(cpumask_bits(dstp), cpumask_bits(src1p),
356 cpumask_bits(src2p), nr_cpumask_bits);
357}
358
359
360
361
362
363
364
365static inline void cpumask_or(struct cpumask *dstp, const struct cpumask *src1p,
366 const struct cpumask *src2p)
367{
368 bitmap_or(cpumask_bits(dstp), cpumask_bits(src1p),
369 cpumask_bits(src2p), nr_cpumask_bits);
370}
371
372
373
374
375
376
377
378static inline void cpumask_xor(struct cpumask *dstp,
379 const struct cpumask *src1p,
380 const struct cpumask *src2p)
381{
382 bitmap_xor(cpumask_bits(dstp), cpumask_bits(src1p),
383 cpumask_bits(src2p), nr_cpumask_bits);
384}
385
386
387
388
389
390
391
392
393
394static inline int cpumask_andnot(struct cpumask *dstp,
395 const struct cpumask *src1p,
396 const struct cpumask *src2p)
397{
398 return bitmap_andnot(cpumask_bits(dstp), cpumask_bits(src1p),
399 cpumask_bits(src2p), nr_cpumask_bits);
400}
401
402
403
404
405
406
407static inline void cpumask_complement(struct cpumask *dstp,
408 const struct cpumask *srcp)
409{
410 bitmap_complement(cpumask_bits(dstp), cpumask_bits(srcp),
411 nr_cpumask_bits);
412}
413
414
415
416
417
418
419static inline bool cpumask_equal(const struct cpumask *src1p,
420 const struct cpumask *src2p)
421{
422 return bitmap_equal(cpumask_bits(src1p), cpumask_bits(src2p),
423 nr_cpumask_bits);
424}
425
426
427
428
429
430
431static inline bool cpumask_intersects(const struct cpumask *src1p,
432 const struct cpumask *src2p)
433{
434 return bitmap_intersects(cpumask_bits(src1p), cpumask_bits(src2p),
435 nr_cpumask_bits);
436}
437
438
439
440
441
442
443
444
445static inline int cpumask_subset(const struct cpumask *src1p,
446 const struct cpumask *src2p)
447{
448 return bitmap_subset(cpumask_bits(src1p), cpumask_bits(src2p),
449 nr_cpumask_bits);
450}
451
452
453
454
455
456static inline bool cpumask_empty(const struct cpumask *srcp)
457{
458 return bitmap_empty(cpumask_bits(srcp), nr_cpumask_bits);
459}
460
461
462
463
464
465static inline bool cpumask_full(const struct cpumask *srcp)
466{
467 return bitmap_full(cpumask_bits(srcp), nr_cpumask_bits);
468}
469
470
471
472
473
474static inline unsigned int cpumask_weight(const struct cpumask *srcp)
475{
476 return bitmap_weight(cpumask_bits(srcp), nr_cpumask_bits);
477}
478
479
480
481
482
483
484
485static inline void cpumask_shift_right(struct cpumask *dstp,
486 const struct cpumask *srcp, int n)
487{
488 bitmap_shift_right(cpumask_bits(dstp), cpumask_bits(srcp), n,
489 nr_cpumask_bits);
490}
491
492
493
494
495
496
497
498static inline void cpumask_shift_left(struct cpumask *dstp,
499 const struct cpumask *srcp, int n)
500{
501 bitmap_shift_left(cpumask_bits(dstp), cpumask_bits(srcp), n,
502 nr_cpumask_bits);
503}
504
505
506
507
508
509
510static inline void cpumask_copy(struct cpumask *dstp,
511 const struct cpumask *srcp)
512{
513 bitmap_copy(cpumask_bits(dstp), cpumask_bits(srcp), nr_cpumask_bits);
514}
515
516
517
518
519
520
521
522#define cpumask_any(srcp) cpumask_first(srcp)
523
524
525
526
527
528
529
530
531#define cpumask_first_and(src1p, src2p) cpumask_next_and(-1, (src1p), (src2p))
532
533
534
535
536
537
538
539
540#define cpumask_any_and(mask1, mask2) cpumask_first_and((mask1), (mask2))
541
542
543
544
545
546#define cpumask_of(cpu) (get_cpu_mask(cpu))
547
548
549
550
551
552
553
554
555
556static inline int cpumask_parse_user(const char __user *buf, int len,
557 struct cpumask *dstp)
558{
559 return bitmap_parse_user(buf, len, cpumask_bits(dstp), nr_cpu_ids);
560}
561
562
563
564
565
566
567
568
569
570static inline int cpumask_parselist_user(const char __user *buf, int len,
571 struct cpumask *dstp)
572{
573 return bitmap_parselist_user(buf, len, cpumask_bits(dstp),
574 nr_cpu_ids);
575}
576
577
578
579
580
581
582
583
584static inline int cpumask_parse(const char *buf, struct cpumask *dstp)
585{
586 char *nl = strchr(buf, '\n');
587 unsigned int len = nl ? (unsigned int)(nl - buf) : strlen(buf);
588
589 return bitmap_parse(buf, len, cpumask_bits(dstp), nr_cpu_ids);
590}
591
592
593
594
595
596
597
598
599static inline int cpulist_parse(const char *buf, struct cpumask *dstp)
600{
601 return bitmap_parselist(buf, cpumask_bits(dstp), nr_cpu_ids);
602}
603
604
605
606
607
608
609static inline size_t cpumask_size(void)
610{
611 return BITS_TO_LONGS(nr_cpumask_bits) * sizeof(long);
612}
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651#ifdef CONFIG_CPUMASK_OFFSTACK
652typedef struct cpumask *cpumask_var_t;
653
654#define this_cpu_cpumask_var_ptr(x) this_cpu_read(x)
655
656bool alloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags, int node);
657bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags);
658bool zalloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags, int node);
659bool zalloc_cpumask_var(cpumask_var_t *mask, gfp_t flags);
660void alloc_bootmem_cpumask_var(cpumask_var_t *mask);
661void free_cpumask_var(cpumask_var_t mask);
662void free_bootmem_cpumask_var(cpumask_var_t mask);
663
664#else
665typedef struct cpumask cpumask_var_t[1];
666
667#define this_cpu_cpumask_var_ptr(x) this_cpu_ptr(x)
668
669static inline bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags)
670{
671 return true;
672}
673
674static inline bool alloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags,
675 int node)
676{
677 return true;
678}
679
680static inline bool zalloc_cpumask_var(cpumask_var_t *mask, gfp_t flags)
681{
682 cpumask_clear(*mask);
683 return true;
684}
685
686static inline bool zalloc_cpumask_var_node(cpumask_var_t *mask, gfp_t flags,
687 int node)
688{
689 cpumask_clear(*mask);
690 return true;
691}
692
693static inline void alloc_bootmem_cpumask_var(cpumask_var_t *mask)
694{
695}
696
697static inline void free_cpumask_var(cpumask_var_t mask)
698{
699}
700
701static inline void free_bootmem_cpumask_var(cpumask_var_t mask)
702{
703}
704#endif
705
706
707
708extern const DECLARE_BITMAP(cpu_all_bits, NR_CPUS);
709#define cpu_all_mask to_cpumask(cpu_all_bits)
710
711
712#define cpu_none_mask to_cpumask(cpu_bit_bitmap[0])
713
714#define for_each_possible_cpu(cpu) for_each_cpu((cpu), cpu_possible_mask)
715#define for_each_online_cpu(cpu) for_each_cpu((cpu), cpu_online_mask)
716#define for_each_present_cpu(cpu) for_each_cpu((cpu), cpu_present_mask)
717
718
719void set_cpu_possible(unsigned int cpu, bool possible);
720void set_cpu_present(unsigned int cpu, bool present);
721void set_cpu_online(unsigned int cpu, bool online);
722void set_cpu_active(unsigned int cpu, bool active);
723void init_cpu_present(const struct cpumask *src);
724void init_cpu_possible(const struct cpumask *src);
725void init_cpu_online(const struct cpumask *src);
726
727
728
729
730
731
732
733
734
735
736
737#define to_cpumask(bitmap) \
738 ((struct cpumask *)(1 ? (bitmap) \
739 : (void *)sizeof(__check_is_bitmap(bitmap))))
740
741static inline int __check_is_bitmap(const unsigned long *bitmap)
742{
743 return 1;
744}
745
746
747
748
749
750
751
752
753extern const unsigned long
754 cpu_bit_bitmap[BITS_PER_LONG+1][BITS_TO_LONGS(NR_CPUS)];
755
756static inline const struct cpumask *get_cpu_mask(unsigned int cpu)
757{
758 const unsigned long *p = cpu_bit_bitmap[1 + cpu % BITS_PER_LONG];
759 p -= cpu / BITS_PER_LONG;
760 return to_cpumask(p);
761}
762
763#define cpu_is_offline(cpu) unlikely(!cpu_online(cpu))
764
765#if NR_CPUS <= BITS_PER_LONG
766#define CPU_BITS_ALL \
767{ \
768 [BITS_TO_LONGS(NR_CPUS)-1] = BITMAP_LAST_WORD_MASK(NR_CPUS) \
769}
770
771#else
772
773#define CPU_BITS_ALL \
774{ \
775 [0 ... BITS_TO_LONGS(NR_CPUS)-2] = ~0UL, \
776 [BITS_TO_LONGS(NR_CPUS)-1] = BITMAP_LAST_WORD_MASK(NR_CPUS) \
777}
778#endif
779
780
781
782
783
784
785
786
787
788
789
790static inline ssize_t
791cpumap_print_to_pagebuf(bool list, char *buf, const struct cpumask *mask)
792{
793 return bitmap_print_to_pagebuf(list, buf, cpumask_bits(mask),
794 nr_cpu_ids);
795}
796
797#if NR_CPUS <= BITS_PER_LONG
798#define CPU_MASK_ALL \
799(cpumask_t) { { \
800 [BITS_TO_LONGS(NR_CPUS)-1] = BITMAP_LAST_WORD_MASK(NR_CPUS) \
801} }
802#else
803#define CPU_MASK_ALL \
804(cpumask_t) { { \
805 [0 ... BITS_TO_LONGS(NR_CPUS)-2] = ~0UL, \
806 [BITS_TO_LONGS(NR_CPUS)-1] = BITMAP_LAST_WORD_MASK(NR_CPUS) \
807} }
808#endif
809
810#define CPU_MASK_NONE \
811(cpumask_t) { { \
812 [0 ... BITS_TO_LONGS(NR_CPUS)-1] = 0UL \
813} }
814
815#define CPU_MASK_CPU0 \
816(cpumask_t) { { \
817 [0] = 1UL \
818} }
819
820#endif
821