Re: Re: [PATCH] bitmap: Add bitmap_valloc(), bitmap_vzalloc() and bitmap_vfree()

2018-12-28 Thread 王鹏
On Date: Fri, 28 Dec 2018 15:41:37 -0800 Andrew Morton 
 wrote:

> From: "Andrew Morton" 
> Sent Time: 2018-12-29 07:41:37 (Saturday)
> To: "Peng Wang" 
> Cc: andriy.shevche...@linux.intel.com, li...@rasmusvillemoes.dk, 
> yno...@caviumnetworks.com, a...@arndb.de, cour...@google.com, osan...@fb.com, 
> linux-kernel@vger.kernel.org
> Subject: Re: [PATCH] bitmap: Add bitmap_valloc(), bitmap_vzalloc() and 
> bitmap_vfree()
> 
> On Fri, 28 Dec 2018 00:18:29 +0800 Peng Wang  wrote:
> 
> > Introduce bitmap alloc/free helpers when contiguous
> > memory is not necessary.
> 
> That's a large bitmap you have there.  What code needs this?

Hi Andrew,
Not only for large bitmap. This can also benefit from high memory pressure with 
no requirement for physical continuousness.

While these two casees are rather rare. And I only find one place in 
mm/swapfile.c.

3224 /* frontswap enabled? set up bit-per-page map for frontswap */
3225 if (IS_ENABLED(CONFIG_FRONTSWAP))
3226 frontswap_map = kvcalloc(BITS_TO_LONGS(maxpages),
3227  sizeof(long),
3228  GFP_KERNEL);

I am not sure whether these helper functions can gain as much benefits as the 
efforts to introduce them.

Cheers,
Peng

Re: [PATCH] bitmap: Add bitmap_valloc(), bitmap_vzalloc() and bitmap_vfree()

2018-12-28 Thread Andrew Morton
On Fri, 28 Dec 2018 00:18:29 +0800 Peng Wang  wrote:

> Introduce bitmap alloc/free helpers when contiguous
> memory is not necessary.

That's a large bitmap you have there.  What code needs this?


[PATCH] bitmap: Add bitmap_valloc(), bitmap_vzalloc() and bitmap_vfree()

2018-12-27 Thread Peng Wang
Introduce bitmap alloc/free helpers when contiguous
memory is not necessary.

Signed-off-by: Peng Wang 
---
 include/linux/bitmap.h |  3 +++
 lib/bitmap.c   | 19 +++
 2 files changed, 22 insertions(+)

diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h
index f58e97446abc..aaad1b33dfd5 100644
--- a/include/linux/bitmap.h
+++ b/include/linux/bitmap.h
@@ -111,6 +111,9 @@
 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);
+extern unsigned long *bitmap_valloc(unsigned int nbits, gfp_t flags);
+extern unsigned long *bitmap_vzalloc(unsigned int nbits, gfp_t flags);
+extern void bitmap_vfree(const unsigned long *bitmap);
 
 /*
  * lib/bitmap.c provides these functions:
diff --git a/lib/bitmap.c b/lib/bitmap.c
index eead55aa7170..739597e436ad 100644
--- a/lib/bitmap.c
+++ b/lib/bitmap.c
@@ -1139,6 +1139,25 @@ void bitmap_free(const unsigned long *bitmap)
 }
 EXPORT_SYMBOL(bitmap_free);
 
+unsigned long *bitmap_valloc(unsigned int nbits, gfp_t flags)
+{
+   return kvmalloc_array(BITS_TO_LONGS(nbits), sizeof(unsigned long),
+flags);
+}
+EXPORT_SYMBOL(bitmap_valloc);
+
+unsigned long *bitmap_vzalloc(unsigned int nbits, gfp_t flags)
+{
+   return bitmap_valloc(nbits, flags | __GFP_ZERO);
+}
+EXPORT_SYMBOL(bitmap_vzalloc);
+
+void bitmap_vfree(const unsigned long *bitmap)
+{
+   kvfree(bitmap);
+}
+EXPORT_SYMBOL(bitmap_vfree);
+
 #if BITS_PER_LONG == 64
 /**
  * bitmap_from_arr32 - copy the contents of u32 array of bits to bitmap
-- 
2.19.1