| From c42b65e363ce97a828f81b59033c3558f8fa7f70 Mon Sep 17 00:00:00 2001 |
| From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Date: Wed, 1 Aug 2018 15:42:56 -0700 |
| Subject: bitmap: Add bitmap_alloc(), bitmap_zalloc() and bitmap_free() |
| |
| From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| |
| commit c42b65e363ce97a828f81b59033c3558f8fa7f70 upstream. |
| |
| A lot of code become ugly because of open coding allocations for bitmaps. |
| |
| Introduce three helpers to allow users be more clear of intention |
| and keep their code neat. |
| |
| Note, due to multiple circular dependencies we may not provide |
| the helpers as inliners. For now we keep them exported and, perhaps, |
| at some point in the future we will sort out header inclusion and |
| inheritance. |
| |
| Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| include/linux/bitmap.h | 8 ++++++++ |
| lib/bitmap.c | 20 ++++++++++++++++++++ |
| 2 files changed, 28 insertions(+) |
| |
| --- a/include/linux/bitmap.h |
| +++ b/include/linux/bitmap.h |
| @@ -86,6 +86,14 @@ |
| */ |
| |
| /* |
| + * Allocation and deallocation of bitmap. |
| + * Provided in lib/bitmap.c to avoid circular dependency. |
| + */ |
| +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); |
| + |
| +/* |
| * lib/bitmap.c provides these functions: |
| */ |
| |
| --- a/lib/bitmap.c |
| +++ b/lib/bitmap.c |
| @@ -13,6 +13,7 @@ |
| #include <linux/bitops.h> |
| #include <linux/bug.h> |
| #include <linux/kernel.h> |
| +#include <linux/slab.h> |
| #include <linux/string.h> |
| #include <linux/uaccess.h> |
| |
| @@ -1212,3 +1213,22 @@ void bitmap_copy_le(unsigned long *dst, |
| } |
| EXPORT_SYMBOL(bitmap_copy_le); |
| #endif |
| + |
| +unsigned long *bitmap_alloc(unsigned int nbits, gfp_t flags) |
| +{ |
| + return kmalloc_array(BITS_TO_LONGS(nbits), sizeof(unsigned long), |
| + flags); |
| +} |
| +EXPORT_SYMBOL(bitmap_alloc); |
| + |
| +unsigned long *bitmap_zalloc(unsigned int nbits, gfp_t flags) |
| +{ |
| + return bitmap_alloc(nbits, flags | __GFP_ZERO); |
| +} |
| +EXPORT_SYMBOL(bitmap_zalloc); |
| + |
| +void bitmap_free(const unsigned long *bitmap) |
| +{ |
| + kfree(bitmap); |
| +} |
| +EXPORT_SYMBOL(bitmap_free); |