diff mbox series

mempool: kvmalloc pool

Message ID 20240201121544.3820874-1-kent.overstreet@linux.dev (mailing list archive)
State New
Headers show
Series mempool: kvmalloc pool | expand

Commit Message

Kent Overstreet Feb. 1, 2024, 12:15 p.m. UTC
Add mempool_init_kvmalloc_pool() and mempool_create_kvmalloc_pool(),
which wrap kvmalloc() instead of kmalloc() - kmalloc() with a vmalloc()
fallback.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Cc: linux-mm@kvack.org
---
 include/linux/mempool.h | 13 +++++++++++++
 mm/mempool.c            | 13 +++++++++++++
 2 files changed, 26 insertions(+)

Comments

Andrew Morton Feb. 2, 2024, 8:39 a.m. UTC | #1
On Thu,  1 Feb 2024 07:15:44 -0500 Kent Overstreet <kent.overstreet@linux.dev> wrote:

> Add mempool_init_kvmalloc_pool() and mempool_create_kvmalloc_pool(),
> which wrap kvmalloc() instead of kmalloc() - kmalloc() with a vmalloc()
> fallback.
> 

Why do we need this?

Can we expect to see users of this?
Kent Overstreet Feb. 2, 2024, 9:44 a.m. UTC | #2
On Fri, Feb 02, 2024 at 12:39:04AM -0800, Andrew Morton wrote:
> On Thu,  1 Feb 2024 07:15:44 -0500 Kent Overstreet <kent.overstreet@linux.dev> wrote:
> 
> > Add mempool_init_kvmalloc_pool() and mempool_create_kvmalloc_pool(),
> > which wrap kvmalloc() instead of kmalloc() - kmalloc() with a vmalloc()
> > fallback.
> > 
> 
> Why do we need this?
> 
> Can we expect to see users of this?

Yeah, I should have had that in the commit message - it's replacing
mempool_init_kvpmalloc_pool() in fs/bcachefs/util.c
diff mbox series

Patch

diff --git a/include/linux/mempool.h b/include/linux/mempool.h
index 7be1e32e6d42..16c5cc807ff6 100644
--- a/include/linux/mempool.h
+++ b/include/linux/mempool.h
@@ -95,6 +95,19 @@  static inline mempool_t *mempool_create_kmalloc_pool(int min_nr, size_t size)
 			      (void *) size);
 }
 
+void *mempool_kvmalloc(gfp_t gfp_mask, void *pool_data);
+void mempool_kvfree(void *element, void *pool_data);
+
+static inline int mempool_init_kvmalloc_pool(mempool_t *pool, int min_nr, size_t size)
+{
+	return mempool_init(pool, min_nr, mempool_kvmalloc, mempool_kvfree, (void *) size);
+}
+
+static inline mempool_t *mempool_create_kvmalloc_pool(int min_nr, size_t size)
+{
+	return mempool_create(min_nr, mempool_kvmalloc, mempool_kvfree, (void *) size);
+}
+
 /*
  * A mempool_alloc_t and mempool_free_t for a simple page allocator that
  * allocates pages of the order specified by pool_data
diff --git a/mm/mempool.c b/mm/mempool.c
index dbbf0e9fb424..076c736f5f1f 100644
--- a/mm/mempool.c
+++ b/mm/mempool.c
@@ -590,6 +590,19 @@  void mempool_kfree(void *element, void *pool_data)
 }
 EXPORT_SYMBOL(mempool_kfree);
 
+void *mempool_kvmalloc(gfp_t gfp_mask, void *pool_data)
+{
+	size_t size = (size_t)pool_data;
+	return kvmalloc(size, gfp_mask);
+}
+EXPORT_SYMBOL(mempool_kvmalloc);
+
+void mempool_kvfree(void *element, void *pool_data)
+{
+	kvfree(element);
+}
+EXPORT_SYMBOL(mempool_kvfree);
+
 /*
  * A simple mempool-backed page allocator that allocates pages
  * of the order specified by pool_data.