Re: [PATCH v2 04/13] tools: bitmap: add missing bitmap_[subset(), andnot()]

"Liam R. Howlett" <[email protected]>
Newsgroups org.kernel.vger.linux-sgx,dev.linux.lists.ntfs3,dev.linux.lists.nvdimm,org.freedesktop.lists.dri-devel,org.freedesktop.lists.intel-gfx,org.kernel.vger.keyrings,org.kernel.vger.linux-cxl,org.kernel.vger.linux-ext4,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel,org.kernel.vger.linux-security-module,org.kernel.vger.linux-xfs,org.kvack.linux-mm,org.ozlabs.lists.linux-erofs
Message-ID <jxt4kif73tbt5aai2aogo2pgho2tlpjkhimjtcw6y6vkemn22c@mn6jzgnnbgxs>
* Lorenzo Stoakes <[email protected]> [260122 16:06]:
> The bitmap_subset() and bitmap_andnot() functions are not present in the
> tools version of include/linux/bitmap.h, so add them as subsequent patches
> implement test code that requires them.
> 
> We also add the missing __bitmap_subset() to tools/lib/bitmap.c.
> 
> Signed-off-by: Lorenzo Stoakes <[email protected]>

Acked-by: Liam R. Howlett <[email protected]>

> ---
>  tools/include/linux/bitmap.h | 22 ++++++++++++++++++++++
>  tools/lib/bitmap.c           | 29 +++++++++++++++++++++++++++++
>  2 files changed, 51 insertions(+)
> 
> diff --git a/tools/include/linux/bitmap.h b/tools/include/linux/bitmap.h
> index 0d992245c600..250883090a5d 100644
> --- a/tools/include/linux/bitmap.h
> +++ b/tools/include/linux/bitmap.h
> @@ -24,6 +24,10 @@ void __bitmap_set(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);
> +bool __bitmap_subset(const unsigned long *bitmap1,
> +		     const unsigned long *bitmap2, unsigned int nbits);
> +bool __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
> +		    const unsigned long *bitmap2, unsigned int nbits);
>  
>  #define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) & (BITS_PER_LONG - 1)))
>  #define BITMAP_LAST_WORD_MASK(nbits) (~0UL >> (-(nbits) & (BITS_PER_LONG - 1)))
> @@ -81,6 +85,15 @@ static inline void bitmap_or(unsigned long *dst, const unsigned long *src1,
>  		__bitmap_or(dst, src1, src2, nbits);
>  }
>  
> +static __always_inline
> +bool bitmap_andnot(unsigned long *dst, const unsigned long *src1,
> +		   const unsigned long *src2, unsigned int nbits)
> +{
> +	if (small_const_nbits(nbits))
> +		return (*dst = *src1 & ~(*src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0;
> +	return __bitmap_andnot(dst, src1, src2, nbits);
> +}
> +
>  static inline unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags __maybe_unused)
>  {
>  	return malloc(bitmap_size(nbits));
> @@ -157,6 +170,15 @@ static inline bool bitmap_intersects(const unsigned long *src1,
>  		return __bitmap_intersects(src1, src2, nbits);
>  }
>  
> +static __always_inline
> +bool bitmap_subset(const unsigned long *src1, const unsigned long *src2, unsigned int nbits)
> +{
> +	if (small_const_nbits(nbits))
> +		return ! ((*src1 & ~(*src2)) & BITMAP_LAST_WORD_MASK(nbits));
> +	else
> +		return __bitmap_subset(src1, src2, nbits);
> +}
> +
>  static inline void bitmap_set(unsigned long *map, unsigned int start, unsigned int nbits)
>  {
>  	if (__builtin_constant_p(nbits) && nbits == 1)
> diff --git a/tools/lib/bitmap.c b/tools/lib/bitmap.c
> index 51255c69754d..aa83d22c45e3 100644
> --- a/tools/lib/bitmap.c
> +++ b/tools/lib/bitmap.c
> @@ -140,3 +140,32 @@ void __bitmap_clear(unsigned long *map, unsigned int start, int len)
>  		*p &= ~mask_to_clear;
>  	}
>  }
> +
> +bool __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
> +				const unsigned long *bitmap2, unsigned int bits)
> +{
> +	unsigned int k;
> +	unsigned int lim = bits/BITS_PER_LONG;
> +	unsigned long result = 0;
> +
> +	for (k = 0; k < lim; k++)
> +		result |= (dst[k] = bitmap1[k] & ~bitmap2[k]);
> +	if (bits % BITS_PER_LONG)
> +		result |= (dst[k] = bitmap1[k] & ~bitmap2[k] &
> +			   BITMAP_LAST_WORD_MASK(bits));
> +	return result != 0;
> +}
> +
> +bool __bitmap_subset(const unsigned long *bitmap1,
> +		     const unsigned long *bitmap2, unsigned int bits)
> +{
> +	unsigned int k, lim = bits/BITS_PER_LONG;
> +	for (k = 0; k < lim; ++k)
> +		if (bitmap1[k] & ~bitmap2[k])
> +			return false;
> +
> +	if (bits % BITS_PER_LONG)
> +		if ((bitmap1[k] & ~bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits))
> +			return false;
> +	return true;
> +}
> -- 
> 2.52.0
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.