Commit 984f2f377fdfd098f5ae58d09ee04d5e29e6112b

Authored by Rusty Russell
Committed by Ingo Molnar
1 parent cd83e42c6b

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)), \
... ... @@ -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 }