diff options
Diffstat (limited to 'lib/cpumask.c')
| -rw-r--r-- | lib/cpumask.c | 40 | 
1 files changed, 16 insertions, 24 deletions
| diff --git a/lib/cpumask.c b/lib/cpumask.c index f0ae119be8c4..c7c392514fd3 100644 --- a/lib/cpumask.c +++ b/lib/cpumask.c @@ -128,23 +128,21 @@ unsigned int cpumask_local_spread(unsigned int i, int node)  	i %= num_online_cpus();  	if (node == NUMA_NO_NODE) { -		for_each_cpu(cpu, cpu_online_mask) -			if (i-- == 0) -				return cpu; +		cpu = cpumask_nth(i, cpu_online_mask); +		if (cpu < nr_cpu_ids) +			return cpu;  	} else {  		/* NUMA first. */ -		for_each_cpu_and(cpu, cpumask_of_node(node), cpu_online_mask) -			if (i-- == 0) -				return cpu; - -		for_each_cpu(cpu, cpu_online_mask) { -			/* Skip NUMA nodes, done above. */ -			if (cpumask_test_cpu(cpu, cpumask_of_node(node))) -				continue; - -			if (i-- == 0) -				return cpu; -		} +		cpu = cpumask_nth_and(i, cpu_online_mask, cpumask_of_node(node)); +		if (cpu < nr_cpu_ids) +			return cpu; + +		i -= cpumask_weight_and(cpu_online_mask, cpumask_of_node(node)); + +		/* Skip NUMA nodes, done above. */ +		cpu = cpumask_nth_andnot(i, cpu_online_mask, cpumask_of_node(node)); +		if (cpu < nr_cpu_ids) +			return cpu;  	}  	BUG();  } @@ -168,10 +166,8 @@ unsigned int cpumask_any_and_distribute(const struct cpumask *src1p,  	/* NOTE: our first selection will skip 0. */  	prev = __this_cpu_read(distribute_cpu_mask_prev); -	next = cpumask_next_and(prev, src1p, src2p); -	if (next >= nr_cpu_ids) -		next = cpumask_first_and(src1p, src2p); - +	next = find_next_and_bit_wrap(cpumask_bits(src1p), cpumask_bits(src2p), +					nr_cpumask_bits, prev + 1);  	if (next < nr_cpu_ids)  		__this_cpu_write(distribute_cpu_mask_prev, next); @@ -185,11 +181,7 @@ unsigned int cpumask_any_distribute(const struct cpumask *srcp)  	/* NOTE: our first selection will skip 0. */  	prev = __this_cpu_read(distribute_cpu_mask_prev); - -	next = cpumask_next(prev, srcp); -	if (next >= nr_cpu_ids) -		next = cpumask_first(srcp); - +	next = find_next_bit_wrap(cpumask_bits(srcp), nr_cpumask_bits, prev + 1);  	if (next < nr_cpu_ids)  		__this_cpu_write(distribute_cpu_mask_prev, next); | 
