Re: [PATCH v3 07/11] lib: bitmap: provide devm_bitmap_alloc() and devm_bitmap_zalloc()

2021-03-10 Thread Greg Kroah-Hartman
On Tue, Mar 09, 2021 at 09:59:17PM +0100, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski 
> 
> Provide managed variants of bitmap_alloc() and bitmap_zalloc().
> 
> Signed-off-by: Bartosz Golaszewski 
> Reviewed-by: Andy Shevchenko 
> ---
>  include/linux/bitmap.h |  8 
>  lib/bitmap.c   | 33 +
>  2 files changed, 41 insertions(+)
> 
> diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h
> index 3282db97e06c..73d039476fa4 100644
> --- a/include/linux/bitmap.h
> +++ b/include/linux/bitmap.h
> @@ -9,6 +9,8 @@
>  #include 
>  #include 
>  
> +struct device;
> +
>  /*
>   * bitmaps provide bit arrays that consume one or more unsigned
>   * longs.  The bitmap interface and available operations are listed
> @@ -122,6 +124,12 @@ unsigned long *bitmap_alloc(unsigned int nbits, gfp_t 
> flags);
>  unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags);
>  void bitmap_free(const unsigned long *bitmap);
>  
> +/* Managed variants of the above. */
> +unsigned long *devm_bitmap_alloc(struct device *dev,
> +  unsigned int nbits, gfp_t flags);
> +unsigned long *devm_bitmap_zalloc(struct device *dev,
> +   unsigned int nbits, gfp_t flags);
> +
>  /*
>   * lib/bitmap.c provides these functions:
>   */
> diff --git a/lib/bitmap.c b/lib/bitmap.c
> index 78f70d9007ad..b4fd7fd084c6 100644
> --- a/lib/bitmap.c
> +++ b/lib/bitmap.c
> @@ -8,6 +8,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>  #include 
> @@ -1263,6 +1264,38 @@ void bitmap_free(const unsigned long *bitmap)
>  }
>  EXPORT_SYMBOL(bitmap_free);
>  
> +static void devm_bitmap_free(void *data)
> +{
> + unsigned long *bitmap = data;
> +
> + bitmap_free(bitmap);
> +}
> +
> +unsigned long *devm_bitmap_alloc(struct device *dev,
> +  unsigned int nbits, gfp_t flags)
> +{
> + unsigned long *bitmap;
> + int ret;
> +
> + bitmap = bitmap_alloc(nbits, flags);
> + if (!bitmap)
> + return NULL;
> +
> + ret = devm_add_action_or_reset(dev, devm_bitmap_free, bitmap);
> + if (ret)
> + return NULL;
> +
> + return bitmap;
> +}
> +EXPORT_SYMBOL(devm_bitmap_alloc);
> +
> +unsigned long *devm_bitmap_zalloc(struct device *dev,
> +   unsigned int nbits, gfp_t flags)
> +{
> + return devm_bitmap_alloc(dev, nbits, flags | __GFP_ZERO);
> +}
> +EXPORT_SYMBOL(devm_bitmap_zalloc);

devm_* functions have been traditionally exported with
EXPORT_SYMBOL_GPL() due to the use of a struct device *.  Perhaps do
that here as well?

thanks,

greg k-h


[PATCH v3 07/11] lib: bitmap: provide devm_bitmap_alloc() and devm_bitmap_zalloc()

2021-03-09 Thread Bartosz Golaszewski
From: Bartosz Golaszewski 

Provide managed variants of bitmap_alloc() and bitmap_zalloc().

Signed-off-by: Bartosz Golaszewski 
Reviewed-by: Andy Shevchenko 
---
 include/linux/bitmap.h |  8 
 lib/bitmap.c   | 33 +
 2 files changed, 41 insertions(+)

diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h
index 3282db97e06c..73d039476fa4 100644
--- a/include/linux/bitmap.h
+++ b/include/linux/bitmap.h
@@ -9,6 +9,8 @@
 #include 
 #include 
 
+struct device;
+
 /*
  * bitmaps provide bit arrays that consume one or more unsigned
  * longs.  The bitmap interface and available operations are listed
@@ -122,6 +124,12 @@ unsigned long *bitmap_alloc(unsigned int nbits, gfp_t 
flags);
 unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags);
 void bitmap_free(const unsigned long *bitmap);
 
+/* Managed variants of the above. */
+unsigned long *devm_bitmap_alloc(struct device *dev,
+unsigned int nbits, gfp_t flags);
+unsigned long *devm_bitmap_zalloc(struct device *dev,
+ unsigned int nbits, gfp_t flags);
+
 /*
  * lib/bitmap.c provides these functions:
  */
diff --git a/lib/bitmap.c b/lib/bitmap.c
index 78f70d9007ad..b4fd7fd084c6 100644
--- a/lib/bitmap.c
+++ b/lib/bitmap.c
@@ -8,6 +8,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -1263,6 +1264,38 @@ void bitmap_free(const unsigned long *bitmap)
 }
 EXPORT_SYMBOL(bitmap_free);
 
+static void devm_bitmap_free(void *data)
+{
+   unsigned long *bitmap = data;
+
+   bitmap_free(bitmap);
+}
+
+unsigned long *devm_bitmap_alloc(struct device *dev,
+unsigned int nbits, gfp_t flags)
+{
+   unsigned long *bitmap;
+   int ret;
+
+   bitmap = bitmap_alloc(nbits, flags);
+   if (!bitmap)
+   return NULL;
+
+   ret = devm_add_action_or_reset(dev, devm_bitmap_free, bitmap);
+   if (ret)
+   return NULL;
+
+   return bitmap;
+}
+EXPORT_SYMBOL(devm_bitmap_alloc);
+
+unsigned long *devm_bitmap_zalloc(struct device *dev,
+ unsigned int nbits, gfp_t flags)
+{
+   return devm_bitmap_alloc(dev, nbits, flags | __GFP_ZERO);
+}
+EXPORT_SYMBOL(devm_bitmap_zalloc);
+
 #if BITS_PER_LONG == 64
 /**
  * bitmap_from_arr32 - copy the contents of u32 array of bits to bitmap
-- 
2.30.1