diff options
Diffstat (limited to 'tools/include/linux/bitmap.h')
| -rw-r--r-- | tools/include/linux/bitmap.h | 17 | 
1 files changed, 16 insertions, 1 deletions
| diff --git a/tools/include/linux/bitmap.h b/tools/include/linux/bitmap.h index 210c13b1b857..2a7f260ef9dc 100644 --- a/tools/include/linux/bitmap.h +++ b/tools/include/linux/bitmap.h @@ -19,7 +19,7 @@ bool __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,  		 const unsigned long *bitmap2, unsigned int bits);  bool __bitmap_equal(const unsigned long *bitmap1,  		    const unsigned long *bitmap2, unsigned int bits); -void bitmap_clear(unsigned long *map, unsigned int start, int len); +void __bitmap_clear(unsigned long *map, unsigned int start, int len);  bool __bitmap_intersects(const unsigned long *bitmap1,  			 const unsigned long *bitmap2, unsigned int bits); @@ -150,4 +150,19 @@ static inline bool bitmap_intersects(const unsigned long *src1,  		return __bitmap_intersects(src1, src2, nbits);  } +static inline void bitmap_clear(unsigned long *map, unsigned int start, +			       unsigned int nbits) +{ +	if (__builtin_constant_p(nbits) && nbits == 1) +		__clear_bit(start, map); +	else if (small_const_nbits(start + nbits)) +		*map &= ~GENMASK(start + nbits - 1, start); +	else if (__builtin_constant_p(start & BITMAP_MEM_MASK) && +		 IS_ALIGNED(start, BITMAP_MEM_ALIGNMENT) && +		 __builtin_constant_p(nbits & BITMAP_MEM_MASK) && +		 IS_ALIGNED(nbits, BITMAP_MEM_ALIGNMENT)) +		memset((char *)map + start / 8, 0, nbits / 8); +	else +		__bitmap_clear(map, start, nbits); +}  #endif /* _TOOLS_LINUX_BITMAP_H */ |