diff options
| -rw-r--r-- | include/linux/bitmap.h | 18 | ||||
| -rw-r--r-- | include/linux/cpumask.h | 20 | ||||
| -rw-r--r-- | lib/bitmap.c | 12 | 
3 files changed, 26 insertions, 24 deletions
diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h index 2878811c613..756d78b8c1c 100644 --- a/include/linux/bitmap.h +++ b/include/linux/bitmap.h @@ -94,13 +94,13 @@ extern void __bitmap_shift_right(unsigned long *dst,                          const unsigned long *src, int shift, int bits);  extern void __bitmap_shift_left(unsigned long *dst,                          const unsigned long *src, int shift, int bits); -extern void __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, +extern int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,  			const unsigned long *bitmap2, int bits);  extern void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,  			const unsigned long *bitmap2, int bits);  extern void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,  			const unsigned long *bitmap2, int bits); -extern void __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1, +extern int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,  			const unsigned long *bitmap2, int bits);  extern int __bitmap_intersects(const unsigned long *bitmap1,  			const unsigned long *bitmap2, int bits); @@ -171,13 +171,12 @@ static inline void bitmap_copy(unsigned long *dst, const unsigned long *src,  	}  } -static inline void bitmap_and(unsigned long *dst, const unsigned long *src1, +static inline int bitmap_and(unsigned long *dst, const unsigned long *src1,  			const unsigned long *src2, int nbits)  {  	if (small_const_nbits(nbits)) -		*dst = *src1 & *src2; -	else -		__bitmap_and(dst, src1, src2, nbits); +		return (*dst = *src1 & *src2) != 0; +	return __bitmap_and(dst, src1, src2, nbits);  }  static inline void bitmap_or(unsigned long *dst, const unsigned long *src1, @@ -198,13 +197,12 @@ static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1,  		__bitmap_xor(dst, src1, src2, nbits);  } -static inline void bitmap_andnot(unsigned long *dst, const unsigned long *src1, +static inline int bitmap_andnot(unsigned long *dst, const unsigned long *src1,  			const unsigned long *src2, int nbits)  {  	if (small_const_nbits(nbits)) -		*dst = *src1 & ~(*src2); -	else -		__bitmap_andnot(dst, src1, src2, nbits); +		return (*dst = *src1 & ~(*src2)) != 0; +	return __bitmap_andnot(dst, src1, src2, nbits);  }  static inline void bitmap_complement(unsigned long *dst, const unsigned long *src, diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h index c5ac87ca7bc..796df12091b 100644 --- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h @@ -43,10 +43,10 @@   * int cpu_isset(cpu, mask)		true iff bit 'cpu' set in mask   * int cpu_test_and_set(cpu, mask)	test and set bit 'cpu' in mask   * - * void cpus_and(dst, src1, src2)	dst = src1 & src2  [intersection] + * int cpus_and(dst, src1, src2)	dst = src1 & src2  [intersection]   * void cpus_or(dst, src1, src2)	dst = src1 | src2  [union]   * void cpus_xor(dst, src1, src2)	dst = src1 ^ src2 - * void cpus_andnot(dst, src1, src2)	dst = src1 & ~src2 + * int cpus_andnot(dst, src1, src2)	dst = src1 & ~src2   * void cpus_complement(dst, src)	dst = ~src   *   * int cpus_equal(mask1, mask2)		Does mask1 == mask2? @@ -179,10 +179,10 @@ static inline int __cpu_test_and_set(int cpu, cpumask_t *addr)  }  #define cpus_and(dst, src1, src2) __cpus_and(&(dst), &(src1), &(src2), NR_CPUS) -static inline void __cpus_and(cpumask_t *dstp, const cpumask_t *src1p, +static inline int __cpus_and(cpumask_t *dstp, const cpumask_t *src1p,  					const cpumask_t *src2p, int nbits)  { -	bitmap_and(dstp->bits, src1p->bits, src2p->bits, nbits); +	return bitmap_and(dstp->bits, src1p->bits, src2p->bits, nbits);  }  #define cpus_or(dst, src1, src2) __cpus_or(&(dst), &(src1), &(src2), NR_CPUS) @@ -201,10 +201,10 @@ static inline void __cpus_xor(cpumask_t *dstp, const cpumask_t *src1p,  #define cpus_andnot(dst, src1, src2) \  				__cpus_andnot(&(dst), &(src1), &(src2), NR_CPUS) -static inline void __cpus_andnot(cpumask_t *dstp, const cpumask_t *src1p, +static inline int __cpus_andnot(cpumask_t *dstp, const cpumask_t *src1p,  					const cpumask_t *src2p, int nbits)  { -	bitmap_andnot(dstp->bits, src1p->bits, src2p->bits, nbits); +	return bitmap_andnot(dstp->bits, src1p->bits, src2p->bits, nbits);  }  #define cpus_complement(dst, src) __cpus_complement(&(dst), &(src), NR_CPUS) @@ -738,11 +738,11 @@ static inline void cpumask_clear(struct cpumask *dstp)   * @src1p: the first input   * @src2p: the second input   */ -static inline void cpumask_and(struct cpumask *dstp, +static inline int cpumask_and(struct cpumask *dstp,  			       const struct cpumask *src1p,  			       const struct cpumask *src2p)  { -	bitmap_and(cpumask_bits(dstp), cpumask_bits(src1p), +	return bitmap_and(cpumask_bits(dstp), cpumask_bits(src1p),  				       cpumask_bits(src2p), nr_cpumask_bits);  } @@ -779,11 +779,11 @@ static inline void cpumask_xor(struct cpumask *dstp,   * @src1p: the first input   * @src2p: the second input   */ -static inline void cpumask_andnot(struct cpumask *dstp, +static inline int cpumask_andnot(struct cpumask *dstp,  				  const struct cpumask *src1p,  				  const struct cpumask *src2p)  { -	bitmap_andnot(cpumask_bits(dstp), cpumask_bits(src1p), +	return bitmap_andnot(cpumask_bits(dstp), cpumask_bits(src1p),  					  cpumask_bits(src2p), nr_cpumask_bits);  } diff --git a/lib/bitmap.c b/lib/bitmap.c index 35a1f7ff414..702565821c9 100644 --- a/lib/bitmap.c +++ b/lib/bitmap.c @@ -179,14 +179,16 @@ void __bitmap_shift_left(unsigned long *dst,  }  EXPORT_SYMBOL(__bitmap_shift_left); -void __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, +int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,  				const unsigned long *bitmap2, int bits)  {  	int k;  	int nr = BITS_TO_LONGS(bits); +	unsigned long result = 0;  	for (k = 0; k < nr; k++) -		dst[k] = bitmap1[k] & bitmap2[k]; +		result |= (dst[k] = bitmap1[k] & bitmap2[k]); +	return result != 0;  }  EXPORT_SYMBOL(__bitmap_and); @@ -212,14 +214,16 @@ void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,  }  EXPORT_SYMBOL(__bitmap_xor); -void __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1, +int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,  				const unsigned long *bitmap2, int bits)  {  	int k;  	int nr = BITS_TO_LONGS(bits); +	unsigned long result = 0;  	for (k = 0; k < nr; k++) -		dst[k] = bitmap1[k] & ~bitmap2[k]; +		result |= (dst[k] = bitmap1[k] & ~bitmap2[k]); +	return result != 0;  }  EXPORT_SYMBOL(__bitmap_andnot);  |