Commit 984f2f37 authored by Rusty Russell's avatar Rusty Russell Committed by Ingo Molnar

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: default avatarRusty Russell <rusty@rustcorp.com.au>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent cd83e42c
...@@ -564,12 +564,36 @@ static inline unsigned int cpumask_check(unsigned int cpu) ...@@ -564,12 +564,36 @@ static inline unsigned int cpumask_check(unsigned int cpu)
} }
#if NR_CPUS == 1 #if NR_CPUS == 1
/* Uniprocesor. */ /* Uniprocessor. Assume all masks are "1". */
#define cpumask_first(src) ({ (void)(src); 0; }) static inline unsigned int cpumask_first(const struct cpumask *srcp)
#define cpumask_next(n, src) ({ (void)(src); 1; }) {
#define cpumask_next_zero(n, src) ({ (void)(src); 1; }) return 0;
#define cpumask_next_and(n, srcp, andp) ({ (void)(srcp), (void)(andp); 1; }) }
#define cpumask_any_but(mask, cpu) ({ (void)(mask); (void)(cpu); 0; })
/* Valid inputs for n are -1 and 0. */
static inline unsigned int cpumask_next(int n, const struct cpumask *srcp)
{
return n+1;
}
static inline unsigned int cpumask_next_zero(int n, const struct cpumask *srcp)
{
return n+1;
}
static inline unsigned int cpumask_next_and(int n,
const struct cpumask *srcp,
const struct cpumask *andp)
{
return n+1;
}
/* cpu must be a valid cpu, ie 0, so there's no other choice. */
static inline unsigned int cpumask_any_but(const struct cpumask *mask,
unsigned int cpu)
{
return 1;
}
#define for_each_cpu(cpu, mask) \ #define for_each_cpu(cpu, mask) \
for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask) for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask)
...@@ -620,10 +644,32 @@ static inline unsigned int cpumask_next_zero(int n, const struct cpumask *srcp) ...@@ -620,10 +644,32 @@ static inline unsigned int cpumask_next_zero(int n, const struct cpumask *srcp)
int cpumask_next_and(int n, const struct cpumask *, const struct cpumask *); int cpumask_next_and(int n, const struct cpumask *, const struct cpumask *);
int cpumask_any_but(const struct cpumask *mask, unsigned int cpu); int cpumask_any_but(const struct cpumask *mask, unsigned int cpu);
/**
* for_each_cpu - iterate over every cpu in a mask
* @cpu: the (optionally unsigned) integer iterator
* @mask: the cpumask pointer
*
* After the loop, cpu is >= nr_cpu_ids.
*/
#define for_each_cpu(cpu, mask) \ #define for_each_cpu(cpu, mask) \
for ((cpu) = -1; \ for ((cpu) = -1; \
(cpu) = cpumask_next((cpu), (mask)), \ (cpu) = cpumask_next((cpu), (mask)), \
(cpu) < nr_cpu_ids;) (cpu) < nr_cpu_ids;)
/**
* for_each_cpu_and - iterate over every cpu in both masks
* @cpu: the (optionally unsigned) integer iterator
* @mask: the first cpumask pointer
* @and: the second cpumask pointer
*
* This saves a temporary CPU mask in many places. It is equivalent to:
* struct cpumask tmp;
* cpumask_and(&tmp, &mask, &and);
* for_each_cpu(cpu, &tmp)
* ...
*
* After the loop, cpu is >= nr_cpu_ids.
*/
#define for_each_cpu_and(cpu, mask, and) \ #define for_each_cpu_and(cpu, mask, and) \
for ((cpu) = -1; \ for ((cpu) = -1; \
(cpu) = cpumask_next_and((cpu), (mask), (and)), \ (cpu) = cpumask_next_and((cpu), (mask), (and)), \
......
...@@ -67,6 +67,7 @@ int cpumask_any_but(const struct cpumask *mask, unsigned int cpu) ...@@ -67,6 +67,7 @@ int cpumask_any_but(const struct cpumask *mask, unsigned int cpu)
{ {
unsigned int i; unsigned int i;
cpumask_check(cpu);
for_each_cpu(i, mask) for_each_cpu(i, mask)
if (i != cpu) if (i != cpu)
break; break;
...@@ -108,7 +109,7 @@ void free_cpumask_var(cpumask_var_t mask) ...@@ -108,7 +109,7 @@ void free_cpumask_var(cpumask_var_t mask)
} }
EXPORT_SYMBOL(free_cpumask_var); EXPORT_SYMBOL(free_cpumask_var);
void free_bootmem_cpumask_var(cpumask_var_t mask) void __init free_bootmem_cpumask_var(cpumask_var_t mask)
{ {
free_bootmem((unsigned long)mask, cpumask_size()); free_bootmem((unsigned long)mask, cpumask_size());
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment