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
138
139
140#include <linux/kernel.h>
141#include <linux/threads.h>
142#include <linux/bitmap.h>
143
144typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;
145extern cpumask_t _unused_cpumask_arg_;
146
147#define cpu_set(cpu, dst) __cpu_set((cpu), &(dst))
148static inline void __cpu_set(int cpu, volatile cpumask_t *dstp)
149{
150 set_bit(cpu, dstp->bits);
151}
152
153#define cpu_clear(cpu, dst) __cpu_clear((cpu), &(dst))
154static inline void __cpu_clear(int cpu, volatile cpumask_t *dstp)
155{
156 clear_bit(cpu, dstp->bits);
157}
158
159#define cpus_setall(dst) __cpus_setall(&(dst), NR_CPUS)
160static inline void __cpus_setall(cpumask_t *dstp, int nbits)
161{
162 bitmap_fill(dstp->bits, nbits);
163}
164
165#define cpus_clear(dst) __cpus_clear(&(dst), NR_CPUS)
166static inline void __cpus_clear(cpumask_t *dstp, int nbits)
167{
168 bitmap_zero(dstp->bits, nbits);
169}
170
171
172#define cpu_isset(cpu, cpumask) test_bit((cpu), (cpumask).bits)
173
174#define cpu_test_and_set(cpu, cpumask) __cpu_test_and_set((cpu), &(cpumask))
175static inline int __cpu_test_and_set(int cpu, cpumask_t *addr)
176{
177 return test_and_set_bit(cpu, addr->bits);
178}
179
180#define cpus_and(dst, src1, src2) __cpus_and(&(dst), &(src1), &(src2), NR_CPUS)
181static inline void __cpus_and(cpumask_t *dstp, const cpumask_t *src1p,
182 const cpumask_t *src2p, int nbits)
183{
184 bitmap_and(dstp->bits, src1p->bits, src2p->bits, nbits);
185}
186
187#define cpus_or(dst, src1, src2) __cpus_or(&(dst), &(src1), &(src2), NR_CPUS)
188static inline void __cpus_or(cpumask_t *dstp, const cpumask_t *src1p,
189 const cpumask_t *src2p, int nbits)
190{
191 bitmap_or(dstp->bits, src1p->bits, src2p->bits, nbits);
192}
193
194#define cpus_xor(dst, src1, src2) __cpus_xor(&(dst), &(src1), &(src2), NR_CPUS)
195static inline void __cpus_xor(cpumask_t *dstp, const cpumask_t *src1p,
196 const cpumask_t *src2p, int nbits)
197{
198 bitmap_xor(dstp->bits, src1p->bits, src2p->bits, nbits);
199}
200
201#define cpus_andnot(dst, src1, src2) \
202 __cpus_andnot(&(dst), &(src1), &(src2), NR_CPUS)
203static inline void __cpus_andnot(cpumask_t *dstp, const cpumask_t *src1p,
204 const cpumask_t *src2p, int nbits)
205{
206 bitmap_andnot(dstp->bits, src1p->bits, src2p->bits, nbits);
207}
208
209#define cpus_complement(dst, src) __cpus_complement(&(dst), &(src), NR_CPUS)
210static inline void __cpus_complement(cpumask_t *dstp,
211 const cpumask_t *srcp, int nbits)
212{
213 bitmap_complement(dstp->bits, srcp->bits, nbits);
214}
215
216#define cpus_equal(src1, src2) __cpus_equal(&(src1), &(src2), NR_CPUS)
217static inline int __cpus_equal(const cpumask_t *src1p,
218 const cpumask_t *src2p, int nbits)
219{
220 return bitmap_equal(src1p->bits, src2p->bits, nbits);
221}
222
223#define cpus_intersects(src1, src2) __cpus_intersects(&(src1), &(src2), NR_CPUS)
224static inline int __cpus_intersects(const cpumask_t *src1p,
225 const cpumask_t *src2p, int nbits)
226{
227 return bitmap_intersects(src1p->bits, src2p->bits, nbits);
228}
229
230#define cpus_subset(src1, src2) __cpus_subset(&(src1), &(src2), NR_CPUS)
231static inline int __cpus_subset(const cpumask_t *src1p,
232 const cpumask_t *src2p, int nbits)
233{
234 return bitmap_subset(src1p->bits, src2p->bits, nbits);
235}
236
237#define cpus_empty(src) __cpus_empty(&(src), NR_CPUS)
238static inline int __cpus_empty(const cpumask_t *srcp, int nbits)
239{
240 return bitmap_empty(srcp->bits, nbits);
241}
242
243#define cpus_full(cpumask) __cpus_full(&(cpumask), NR_CPUS)
244static inline int __cpus_full(const cpumask_t *srcp, int nbits)
245{
246 return bitmap_full(srcp->bits, nbits);
247}
248
249#define cpus_weight(cpumask) __cpus_weight(&(cpumask), NR_CPUS)
250static inline int __cpus_weight(const cpumask_t *srcp, int nbits)
251{
252 return bitmap_weight(srcp->bits, nbits);
253}
254
255#define cpus_shift_right(dst, src, n) \
256 __cpus_shift_right(&(dst), &(src), (n), NR_CPUS)
257static inline void __cpus_shift_right(cpumask_t *dstp,
258 const cpumask_t *srcp, int n, int nbits)
259{
260 bitmap_shift_right(dstp->bits, srcp->bits, n, nbits);
261}
262
263#define cpus_shift_left(dst, src, n) \
264 __cpus_shift_left(&(dst), &(src), (n), NR_CPUS)
265static inline void __cpus_shift_left(cpumask_t *dstp,
266 const cpumask_t *srcp, int n, int nbits)
267{
268 bitmap_shift_left(dstp->bits, srcp->bits, n, nbits);
269}
270
271
272
273
274
275
276
277
278extern const unsigned long
279 cpu_bit_bitmap[BITS_PER_LONG+1][BITS_TO_LONGS(NR_CPUS)];
280
281static inline const cpumask_t *get_cpu_mask(unsigned int cpu)
282{
283 const unsigned long *p = cpu_bit_bitmap[1 + cpu % BITS_PER_LONG];
284 p -= cpu / BITS_PER_LONG;
285 return (const cpumask_t *)p;
286}
287
288
289
290
291
292
293#define cpumask_of_cpu(cpu) (*get_cpu_mask(cpu))
294
295
296#define CPU_MASK_LAST_WORD BITMAP_LAST_WORD_MASK(NR_CPUS)
297
298#if NR_CPUS <= BITS_PER_LONG
299
300#define CPU_MASK_ALL \
301(cpumask_t) { { \
302 [BITS_TO_LONGS(NR_CPUS)-1] = CPU_MASK_LAST_WORD \
303} }
304
305#define CPU_MASK_ALL_PTR (&CPU_MASK_ALL)
306
307#else
308
309#define CPU_MASK_ALL \
310(cpumask_t) { { \
311 [0 ... BITS_TO_LONGS(NR_CPUS)-2] = ~0UL, \
312 [BITS_TO_LONGS(NR_CPUS)-1] = CPU_MASK_LAST_WORD \
313} }
314
315
316extern cpumask_t cpu_mask_all;
317#define CPU_MASK_ALL_PTR (&cpu_mask_all)
318
319#endif
320
321#define CPU_MASK_NONE \
322(cpumask_t) { { \
323 [0 ... BITS_TO_LONGS(NR_CPUS)-1] = 0UL \
324} }
325
326#define CPU_MASK_CPU0 \
327(cpumask_t) { { \
328 [0] = 1UL \
329} }
330
331#define cpus_addr(src) ((src).bits)
332
333#if NR_CPUS > BITS_PER_LONG
334#define CPUMASK_ALLOC(m) struct m *m = kmalloc(sizeof(*m), GFP_KERNEL)
335#define CPUMASK_FREE(m) kfree(m)
336#else
337#define CPUMASK_ALLOC(m) struct m _m, *m = &_m
338#define CPUMASK_FREE(m)
339#endif
340#define CPUMASK_PTR(v, m) cpumask_t *v = &(m->v)
341
342#define cpumask_scnprintf(buf, len, src) \
343 __cpumask_scnprintf((buf), (len), &(src), NR_CPUS)
344static inline int __cpumask_scnprintf(char *buf, int len,
345 const cpumask_t *srcp, int nbits)
346{
347 return bitmap_scnprintf(buf, len, srcp->bits, nbits);
348}
349
350#define cpumask_parse_user(ubuf, ulen, dst) \
351 __cpumask_parse_user((ubuf), (ulen), &(dst), NR_CPUS)
352static inline int __cpumask_parse_user(const char __user *buf, int len,
353 cpumask_t *dstp, int nbits)
354{
355 return bitmap_parse_user(buf, len, dstp->bits, nbits);
356}
357
358#define cpulist_scnprintf(buf, len, src) \
359 __cpulist_scnprintf((buf), (len), &(src), NR_CPUS)
360static inline int __cpulist_scnprintf(char *buf, int len,
361 const cpumask_t *srcp, int nbits)
362{
363 return bitmap_scnlistprintf(buf, len, srcp->bits, nbits);
364}
365
366#define cpulist_parse(buf, dst) __cpulist_parse((buf), &(dst), NR_CPUS)
367static inline int __cpulist_parse(const char *buf, cpumask_t *dstp, int nbits)
368{
369 return bitmap_parselist(buf, dstp->bits, nbits);
370}
371
372#define cpu_remap(oldbit, old, new) \
373 __cpu_remap((oldbit), &(old), &(new), NR_CPUS)
374static inline int __cpu_remap(int oldbit,
375 const cpumask_t *oldp, const cpumask_t *newp, int nbits)
376{
377 return bitmap_bitremap(oldbit, oldp->bits, newp->bits, nbits);
378}
379
380#define cpus_remap(dst, src, old, new) \
381 __cpus_remap(&(dst), &(src), &(old), &(new), NR_CPUS)
382static inline void __cpus_remap(cpumask_t *dstp, const cpumask_t *srcp,
383 const cpumask_t *oldp, const cpumask_t *newp, int nbits)
384{
385 bitmap_remap(dstp->bits, srcp->bits, oldp->bits, newp->bits, nbits);
386}
387
388#define cpus_onto(dst, orig, relmap) \
389 __cpus_onto(&(dst), &(orig), &(relmap), NR_CPUS)
390static inline void __cpus_onto(cpumask_t *dstp, const cpumask_t *origp,
391 const cpumask_t *relmapp, int nbits)
392{
393 bitmap_onto(dstp->bits, origp->bits, relmapp->bits, nbits);
394}
395
396#define cpus_fold(dst, orig, sz) \
397 __cpus_fold(&(dst), &(orig), sz, NR_CPUS)
398static inline void __cpus_fold(cpumask_t *dstp, const cpumask_t *origp,
399 int sz, int nbits)
400{
401 bitmap_fold(dstp->bits, origp->bits, sz, nbits);
402}
403
404#if NR_CPUS == 1
405
406#define nr_cpu_ids 1
407#define first_cpu(src) ({ (void)(src); 0; })
408#define next_cpu(n, src) ({ (void)(src); 1; })
409#define any_online_cpu(mask) 0
410#define for_each_cpu_mask(cpu, mask) \
411 for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask)
412
413#else
414
415extern int nr_cpu_ids;
416int __first_cpu(const cpumask_t *srcp);
417int __next_cpu(int n, const cpumask_t *srcp);
418int __any_online_cpu(const cpumask_t *mask);
419
420#define first_cpu(src) __first_cpu(&(src))
421#define next_cpu(n, src) __next_cpu((n), &(src))
422#define any_online_cpu(mask) __any_online_cpu(&(mask))
423#define for_each_cpu_mask(cpu, mask) \
424 for ((cpu) = -1; \
425 (cpu) = next_cpu((cpu), (mask)), \
426 (cpu) < NR_CPUS; )
427#endif
428
429#if NR_CPUS <= 64
430
431#define next_cpu_nr(n, src) next_cpu(n, src)
432#define cpus_weight_nr(cpumask) cpus_weight(cpumask)
433#define for_each_cpu_mask_nr(cpu, mask) for_each_cpu_mask(cpu, mask)
434
435#else
436
437int __next_cpu_nr(int n, const cpumask_t *srcp);
438#define next_cpu_nr(n, src) __next_cpu_nr((n), &(src))
439#define cpus_weight_nr(cpumask) __cpus_weight(&(cpumask), nr_cpu_ids)
440#define for_each_cpu_mask_nr(cpu, mask) \
441 for ((cpu) = -1; \
442 (cpu) = next_cpu_nr((cpu), (mask)), \
443 (cpu) < nr_cpu_ids; )
444
445#endif
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
501
502
503
504extern cpumask_t cpu_possible_map;
505extern cpumask_t cpu_online_map;
506extern cpumask_t cpu_present_map;
507extern cpumask_t cpu_active_map;
508
509#if NR_CPUS > 1
510#define num_online_cpus() cpus_weight_nr(cpu_online_map)
511#define num_possible_cpus() cpus_weight_nr(cpu_possible_map)
512#define num_present_cpus() cpus_weight_nr(cpu_present_map)
513#define cpu_online(cpu) cpu_isset((cpu), cpu_online_map)
514#define cpu_possible(cpu) cpu_isset((cpu), cpu_possible_map)
515#define cpu_present(cpu) cpu_isset((cpu), cpu_present_map)
516#define cpu_active(cpu) cpu_isset((cpu), cpu_active_map)
517#else
518#define num_online_cpus() 1
519#define num_possible_cpus() 1
520#define num_present_cpus() 1
521#define cpu_online(cpu) ((cpu) == 0)
522#define cpu_possible(cpu) ((cpu) == 0)
523#define cpu_present(cpu) ((cpu) == 0)
524#define cpu_active(cpu) ((cpu) == 0)
525#endif
526
527#define cpu_is_offline(cpu) unlikely(!cpu_online(cpu))
528
529#define for_each_possible_cpu(cpu) for_each_cpu_mask_nr((cpu), cpu_possible_map)
530#define for_each_online_cpu(cpu) for_each_cpu_mask_nr((cpu), cpu_online_map)
531#define for_each_present_cpu(cpu) for_each_cpu_mask_nr((cpu), cpu_present_map)
532
533
534
535#define cpumask_bits(maskp) ((maskp)->bits)
536
537#if NR_CPUS <= BITS_PER_LONG
538#define CPU_BITS_ALL \
539{ \
540 [BITS_TO_LONGS(NR_CPUS)-1] = CPU_MASK_LAST_WORD \
541}
542
543
544#define nr_cpumask_bits NR_CPUS
545
546#else
547
548#define CPU_BITS_ALL \
549{ \
550 [0 ... BITS_TO_LONGS(NR_CPUS)-2] = ~0UL, \
551 [BITS_TO_LONGS(NR_CPUS)-1] = CPU_MASK_LAST_WORD \
552}
553
554#define nr_cpumask_bits nr_cpu_ids
555#endif
556
557
558static inline unsigned int cpumask_check(unsigned int cpu)
559{
560#ifdef CONFIG_DEBUG_PER_CPU_MAPS
561 WARN_ON_ONCE(cpu >= nr_cpumask_bits);
562#endif
563 return cpu;
564}
565
566#if NR_CPUS == 1
567
568static inline unsigned int cpumask_first(const struct cpumask *srcp)
569{
570 return 0;
571}
572
573
574static inline unsigned int cpumask_next(int n, const struct cpumask *srcp)
575{
576 return n+1;
577}
578
579static inline unsigned int cpumask_next_zero(int n, const struct cpumask *srcp)
580{
581 return n+1;
582}
583
584static inline unsigned int cpumask_next_and(int n,
585 const struct cpumask *srcp,
586 const struct cpumask *andp)
587{
588 return n+1;
589}
590
591
592static inline unsigned int cpumask_any_but(const struct cpumask *mask,
593 unsigned int cpu)
594{
595 return 1;
596}
597
598#define for_each_cpu(cpu, mask) \
599 for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask)
600#define for_each_cpu_and(cpu, mask, and) \
601 for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask, (void)and)
602#else
603
604
605
606
607
608
609static inline unsigned int cpumask_first(const struct cpumask *srcp)
610{
611 return find_first_bit(cpumask_bits(srcp), nr_cpumask_bits);
612}
613
614
615
616
617
618
619
620
621static inline unsigned int cpumask_next(int n, const struct cpumask *srcp)
622{
623
624 if (n != -1)
625 cpumask_check(n);
626 return find_next_bit(cpumask_bits(srcp), nr_cpumask_bits, n+1);
627}
628
629
630
631
632
633
634
635
636static inline unsigned int cpumask_next_zero(int n, const struct cpumask *srcp)
637{
638
639 if (n != -1)
640 cpumask_check(n);
641 return find_next_zero_bit(cpumask_bits(srcp), nr_cpumask_bits, n+1);
642}
643
644int cpumask_next_and(int n, const struct cpumask *, const struct cpumask *);
645int cpumask_any_but(const struct cpumask *mask, unsigned int cpu);
646
647
648
649
650
651
652
653
654#define for_each_cpu(cpu, mask) \
655 for ((cpu) = -1; \
656 (cpu) = cpumask_next((cpu), (mask)), \
657 (cpu) < nr_cpu_ids;)
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673#define for_each_cpu_and(cpu, mask, and) \
674 for ((cpu) = -1; \
675 (cpu) = cpumask_next_and((cpu), (mask), (and)), \
676 (cpu) < nr_cpu_ids;)
677#endif
678
679#define CPU_BITS_NONE \
680{ \
681 [0 ... BITS_TO_LONGS(NR_CPUS)-1] = 0UL \
682}
683
684#define CPU_BITS_CPU0 \
685{ \
686 [0] = 1UL \
687}
688
689
690
691
692
693
694static inline void cpumask_set_cpu(unsigned int cpu, struct cpumask *dstp)
695{
696 set_bit(cpumask_check(cpu), cpumask_bits(dstp));
697}
698
699
700
701
702
703
704static inline void cpumask_clear_cpu(int cpu, struct cpumask *dstp)
705{
706 clear_bit(cpumask_check(cpu), cpumask_bits(dstp));
707}
708
709
710
711
712
713
714
715
716#define cpumask_test_cpu(cpu, cpumask) \
717 test_bit(cpumask_check(cpu), (cpumask)->bits)
718
719
720
721
722
723
724
725
726static inline int cpumask_test_and_set_cpu(int cpu, struct cpumask *cpumask)
727{
728 return test_and_set_bit(cpumask_check(cpu), cpumask_bits(cpumask));
729}
730
731
732
733
734
735static inline void cpumask_setall(struct cpumask *dstp)
736{
737 bitmap_fill(cpumask_bits(dstp), nr_cpumask_bits);
738}
739
740
741
742
743
744static inline void cpumask_clear(struct cpumask *dstp)
745{
746 bitmap_zero(cpumask_bits(dstp), nr_cpumask_bits);
747}
748
749
750
751
752
753
754
755static inline void cpumask_and(struct cpumask *dstp,
756 const struct cpumask *src1p,
757 const struct cpumask *src2p)
758{
759 bitmap_and(cpumask_bits(dstp), cpumask_bits(src1p),
760 cpumask_bits(src2p), nr_cpumask_bits);
761}
762
763
764
765
766
767
768
769static inline void cpumask_or(struct cpumask *dstp, const struct cpumask *src1p,
770 const struct cpumask *src2p)
771{
772 bitmap_or(cpumask_bits(dstp), cpumask_bits(src1p),
773 cpumask_bits(src2p), nr_cpumask_bits);
774}
775
776
777
778
779
780
781
782static inline void cpumask_xor(struct cpumask *dstp,
783 const struct cpumask *src1p,
784 const struct cpumask *src2p)
785{
786 bitmap_xor(cpumask_bits(dstp), cpumask_bits(src1p),
787 cpumask_bits(src2p), nr_cpumask_bits);
788}
789
790
791
792
793
794
795
796static inline void cpumask_andnot(struct cpumask *dstp,
797 const struct cpumask *src1p,
798 const struct cpumask *src2p)
799{
800 bitmap_andnot(cpumask_bits(dstp), cpumask_bits(src1p),
801 cpumask_bits(src2p), nr_cpumask_bits);
802}
803
804
805
806
807
808
809static inline void cpumask_complement(struct cpumask *dstp,
810 const struct cpumask *srcp)
811{
812 bitmap_complement(cpumask_bits(dstp), cpumask_bits(srcp),
813 nr_cpumask_bits);
814}
815
816
817
818
819
820
821static inline bool cpumask_equal(const struct cpumask *src1p,
822 const struct cpumask *src2p)
823{
824 return bitmap_equal(cpumask_bits(src1p), cpumask_bits(src2p),
825 nr_cpumask_bits);
826}
827
828
829
830
831
832
833static inline bool cpumask_intersects(const struct cpumask *src1p,
834 const struct cpumask *src2p)
835{
836 return bitmap_intersects(cpumask_bits(src1p), cpumask_bits(src2p),
837 nr_cpumask_bits);
838}
839
840
841
842
843
844
845static inline int cpumask_subset(const struct cpumask *src1p,
846 const struct cpumask *src2p)
847{
848 return bitmap_subset(cpumask_bits(src1p), cpumask_bits(src2p),
849 nr_cpumask_bits);
850}
851
852
853
854
855
856static inline bool cpumask_empty(const struct cpumask *srcp)
857{
858 return bitmap_empty(cpumask_bits(srcp), nr_cpumask_bits);
859}
860
861
862
863
864
865static inline bool cpumask_full(const struct cpumask *srcp)
866{
867 return bitmap_full(cpumask_bits(srcp), nr_cpumask_bits);
868}
869
870
871
872
873
874static inline unsigned int cpumask_weight(const struct cpumask *srcp)
875{
876 return bitmap_weight(cpumask_bits(srcp), nr_cpumask_bits);
877}
878
879
880
881
882
883
884
885static inline void cpumask_shift_right(struct cpumask *dstp,
886 const struct cpumask *srcp, int n)
887{
888 bitmap_shift_right(cpumask_bits(dstp), cpumask_bits(srcp), n,
889 nr_cpumask_bits);
890}
891
892
893
894
895
896
897
898static inline void cpumask_shift_left(struct cpumask *dstp,
899 const struct cpumask *srcp, int n)
900{
901 bitmap_shift_left(cpumask_bits(dstp), cpumask_bits(srcp), n,
902 nr_cpumask_bits);
903}
904
905
906
907
908
909
910static inline void cpumask_copy(struct cpumask *dstp,
911 const struct cpumask *srcp)
912{
913 bitmap_copy(cpumask_bits(dstp), cpumask_bits(srcp), nr_cpumask_bits);
914}
915
916
917
918
919
920
921
922#define cpumask_any(srcp) cpumask_first(srcp)
923
924
925
926
927
928
929
930
931#define cpumask_first_and(src1p, src2p) cpumask_next_and(-1, (src1p), (src2p))
932
933
934
935
936
937
938
939
940#define cpumask_any_and(mask1, mask2) cpumask_first_and((mask1), (mask2))
941
942
943
944
945
946#define cpumask_of(cpu) (get_cpu_mask(cpu))
947
948
949
950
951
952
953
954
955
956
957
958#define to_cpumask(bitmap) \
959 ((struct cpumask *)(1 ? (bitmap) \
960 : (void *)sizeof(__check_is_bitmap(bitmap))))
961
962static inline int __check_is_bitmap(const unsigned long *bitmap)
963{
964 return 1;
965}
966
967
968
969
970
971
972static inline size_t cpumask_size(void)
973{
974
975
976 return BITS_TO_LONGS(NR_CPUS) * sizeof(long);
977}
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995#ifdef CONFIG_CPUMASK_OFFSTACK
996typedef struct cpumask *cpumask_var_t;
997
998bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags);
999void alloc_bootmem_cpumask_var(cpumask_var_t *mask);
1000void free_cpumask_var(cpumask_var_t mask);
1001void free_bootmem_cpumask_var(cpumask_var_t mask);
1002
1003#else
1004typedef struct cpumask cpumask_var_t[1];
1005
1006static inline bool alloc_cpumask_var(cpumask_var_t *mask, gfp_t flags)
1007{
1008 return true;
1009}
1010
1011static inline void alloc_bootmem_cpumask_var(cpumask_var_t *mask)
1012{
1013}
1014
1015static inline void free_cpumask_var(cpumask_var_t mask)
1016{
1017}
1018
1019static inline void free_bootmem_cpumask_var(cpumask_var_t mask)
1020{
1021}
1022#endif
1023
1024
1025#define cpu_possible_mask ((const struct cpumask *)&cpu_possible_map)
1026#define cpu_online_mask ((const struct cpumask *)&cpu_online_map)
1027#define cpu_present_mask ((const struct cpumask *)&cpu_present_map)
1028#define cpu_active_mask ((const struct cpumask *)&cpu_active_map)
1029
1030
1031
1032extern const DECLARE_BITMAP(cpu_all_bits, NR_CPUS);
1033#define cpu_all_mask to_cpumask(cpu_all_bits)
1034
1035
1036#define cpu_none_mask to_cpumask(cpu_bit_bitmap[0])
1037
1038
1039static inline void set_cpu_possible(unsigned int cpu, bool possible)
1040{
1041 if (possible)
1042 cpumask_set_cpu(cpu, &cpu_possible_map);
1043 else
1044 cpumask_clear_cpu(cpu, &cpu_possible_map);
1045}
1046
1047static inline void set_cpu_present(unsigned int cpu, bool present)
1048{
1049 if (present)
1050 cpumask_set_cpu(cpu, &cpu_present_map);
1051 else
1052 cpumask_clear_cpu(cpu, &cpu_present_map);
1053}
1054
1055static inline void set_cpu_online(unsigned int cpu, bool online)
1056{
1057 if (online)
1058 cpumask_set_cpu(cpu, &cpu_online_map);
1059 else
1060 cpumask_clear_cpu(cpu, &cpu_online_map);
1061}
1062
1063static inline void set_cpu_active(unsigned int cpu, bool active)
1064{
1065 if (active)
1066 cpumask_set_cpu(cpu, &cpu_active_map);
1067 else
1068 cpumask_clear_cpu(cpu, &cpu_active_map);
1069}
1070
1071static inline void init_cpu_present(const struct cpumask *src)
1072{
1073 cpumask_copy(&cpu_present_map, src);
1074}
1075
1076static inline void init_cpu_possible(const struct cpumask *src)
1077{
1078 cpumask_copy(&cpu_possible_map, src);
1079}
1080
1081static inline void init_cpu_online(const struct cpumask *src)
1082{
1083 cpumask_copy(&cpu_online_map, src);
1084}
1085#endif
1086