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