Commit 984f2f377fdfd098f5ae58d09ee04d5e29e6112b
Committed by
Ingo Molnar
1 parent
cd83e42c6b
Exists in
master
and in
20 other branches
cpumask: introduce new API, without changing anything, v3
Impact: cleanup Clean up based on feedback from Andrew Morton and others: - change to inline functions instead of macros - add __init to bootmem method - add a missing debug check Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Showing 2 changed files with 54 additions and 7 deletions Side-by-side Diff
include/linux/cpumask.h
... | ... | @@ -564,13 +564,37 @@ |
564 | 564 | } |
565 | 565 | |
566 | 566 | #if NR_CPUS == 1 |
567 | -/* Uniprocesor. */ | |
568 | -#define cpumask_first(src) ({ (void)(src); 0; }) | |
569 | -#define cpumask_next(n, src) ({ (void)(src); 1; }) | |
570 | -#define cpumask_next_zero(n, src) ({ (void)(src); 1; }) | |
571 | -#define cpumask_next_and(n, srcp, andp) ({ (void)(srcp), (void)(andp); 1; }) | |
572 | -#define cpumask_any_but(mask, cpu) ({ (void)(mask); (void)(cpu); 0; }) | |
567 | +/* Uniprocessor. Assume all masks are "1". */ | |
568 | +static inline unsigned int cpumask_first(const struct cpumask *srcp) | |
569 | +{ | |
570 | + return 0; | |
571 | +} | |
573 | 572 | |
573 | +/* Valid inputs for n are -1 and 0. */ | |
574 | +static inline unsigned int cpumask_next(int n, const struct cpumask *srcp) | |
575 | +{ | |
576 | + return n+1; | |
577 | +} | |
578 | + | |
579 | +static inline unsigned int cpumask_next_zero(int n, const struct cpumask *srcp) | |
580 | +{ | |
581 | + return n+1; | |
582 | +} | |
583 | + | |
584 | +static 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 | +/* cpu must be a valid cpu, ie 0, so there's no other choice. */ | |
592 | +static inline unsigned int cpumask_any_but(const struct cpumask *mask, | |
593 | + unsigned int cpu) | |
594 | +{ | |
595 | + return 1; | |
596 | +} | |
597 | + | |
574 | 598 | #define for_each_cpu(cpu, mask) \ |
575 | 599 | for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask) |
576 | 600 | #define for_each_cpu_and(cpu, mask, and) \ |
577 | 601 | |
... | ... | @@ -620,10 +644,32 @@ |
620 | 644 | int cpumask_next_and(int n, const struct cpumask *, const struct cpumask *); |
621 | 645 | int cpumask_any_but(const struct cpumask *mask, unsigned int cpu); |
622 | 646 | |
647 | +/** | |
648 | + * for_each_cpu - iterate over every cpu in a mask | |
649 | + * @cpu: the (optionally unsigned) integer iterator | |
650 | + * @mask: the cpumask pointer | |
651 | + * | |
652 | + * After the loop, cpu is >= nr_cpu_ids. | |
653 | + */ | |
623 | 654 | #define for_each_cpu(cpu, mask) \ |
624 | 655 | for ((cpu) = -1; \ |
625 | 656 | (cpu) = cpumask_next((cpu), (mask)), \ |
626 | 657 | (cpu) < nr_cpu_ids;) |
658 | + | |
659 | +/** | |
660 | + * for_each_cpu_and - iterate over every cpu in both masks | |
661 | + * @cpu: the (optionally unsigned) integer iterator | |
662 | + * @mask: the first cpumask pointer | |
663 | + * @and: the second cpumask pointer | |
664 | + * | |
665 | + * This saves a temporary CPU mask in many places. It is equivalent to: | |
666 | + * struct cpumask tmp; | |
667 | + * cpumask_and(&tmp, &mask, &and); | |
668 | + * for_each_cpu(cpu, &tmp) | |
669 | + * ... | |
670 | + * | |
671 | + * After the loop, cpu is >= nr_cpu_ids. | |
672 | + */ | |
627 | 673 | #define for_each_cpu_and(cpu, mask, and) \ |
628 | 674 | for ((cpu) = -1; \ |
629 | 675 | (cpu) = cpumask_next_and((cpu), (mask), (and)), \ |
lib/cpumask.c
... | ... | @@ -67,6 +67,7 @@ |
67 | 67 | { |
68 | 68 | unsigned int i; |
69 | 69 | |
70 | + cpumask_check(cpu); | |
70 | 71 | for_each_cpu(i, mask) |
71 | 72 | if (i != cpu) |
72 | 73 | break; |
... | ... | @@ -108,7 +109,7 @@ |
108 | 109 | } |
109 | 110 | EXPORT_SYMBOL(free_cpumask_var); |
110 | 111 | |
111 | -void free_bootmem_cpumask_var(cpumask_var_t mask) | |
112 | +void __init free_bootmem_cpumask_var(cpumask_var_t mask) | |
112 | 113 | { |
113 | 114 | free_bootmem((unsigned long)mask, cpumask_size()); |
114 | 115 | } |