Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+52 −6
Original line number Original line Diff line number Diff line
@@ -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)
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)),		\
+2 −1
Original line number Original line Diff line number Diff line
@@ -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)
}
}
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());
}
}