lkml.org 
[lkml]   [2022]   [Aug]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 213/545] lib: bitmap: provide devm_bitmap_alloc() and devm_bitmap_zalloc()
    Date
    From: Bartosz Golaszewski <bgolaszewski@baylibre.com>

    [ Upstream commit e829c2e4744850bab4d8f8ffebd00df10b4c6c2b ]

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

    Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
    Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    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 4dd2e1d39c74..c4f6a9270c03 100644
    --- a/include/linux/bitmap.h
    +++ b/include/linux/bitmap.h
    @@ -9,6 +9,8 @@
    #include <linux/string.h>
    #include <linux/types.h>

    +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 @@ extern unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags);
    extern unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags);
    extern 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..27e08c0e547e 100644
    --- a/lib/bitmap.c
    +++ b/lib/bitmap.c
    @@ -8,6 +8,7 @@
    #include <linux/bitops.h>
    #include <linux/bug.h>
    #include <linux/ctype.h>
    +#include <linux/device.h>
    #include <linux/errno.h>
    #include <linux/export.h>
    #include <linux/kernel.h>
    @@ -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_GPL(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_GPL(devm_bitmap_zalloc);
    +
    #if BITS_PER_LONG == 64
    /**
    * bitmap_from_arr32 - copy the contents of u32 array of bits to bitmap
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-19 18:19    [W:4.306 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site