From: andrey.konovalov@linux.dev
To: Marco Elver <elver@google.com>, Alexander Potapenko <glider@google.com>
Cc: Andrey Konovalov <andreyknvl@gmail.com>,
Dmitry Vyukov <dvyukov@google.com>,
Andrey Ryabinin <ryabinin.a.a@gmail.com>,
kasan-dev@googlegroups.com, Evgenii Stepanov <eugenis@google.com>,
Andrew Morton <akpm@linux-foundation.org>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Andrey Konovalov <andreyknvl@google.com>
Subject: [PATCH RFC 14/20] mempool: introduce mempool_use_prealloc_only
Date: Mon, 6 Nov 2023 21:10:23 +0100 [thread overview]
Message-ID: <9752c5fc4763e7533a44a7c9368f056c47b52f34.1699297309.git.andreyknvl@google.com> (raw)
In-Reply-To: <cover.1699297309.git.andreyknvl@google.com>
From: Andrey Konovalov <andreyknvl@google.com>
Introduce a new mempool_use_prealloc_only API that tells the mempool to
only use the elements preallocated during the mempool's creation and to
not attempt allocating new ones.
This API is required to test the KASAN poisoning/unpoisoning functinality
in KASAN tests, but it might be also useful on its own.
Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
---
include/linux/mempool.h | 2 ++
mm/mempool.c | 27 ++++++++++++++++++++++++---
2 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/include/linux/mempool.h b/include/linux/mempool.h
index 4aae6c06c5f2..822adf1e7567 100644
--- a/include/linux/mempool.h
+++ b/include/linux/mempool.h
@@ -18,6 +18,7 @@ typedef struct mempool_s {
int min_nr; /* nr of elements at *elements */
int curr_nr; /* Current nr of elements at *elements */
void **elements;
+ bool use_prealloc_only; /* Use only preallocated elements */
void *pool_data;
mempool_alloc_t *alloc;
@@ -48,6 +49,7 @@ extern mempool_t *mempool_create_node(int min_nr, mempool_alloc_t *alloc_fn,
mempool_free_t *free_fn, void *pool_data,
gfp_t gfp_mask, int nid);
+extern void mempool_use_prealloc_only(mempool_t *pool);
extern int mempool_resize(mempool_t *pool, int new_min_nr);
extern void mempool_destroy(mempool_t *pool);
extern void *mempool_alloc(mempool_t *pool, gfp_t gfp_mask) __malloc;
diff --git a/mm/mempool.c b/mm/mempool.c
index f67ca6753332..59f7fcd355b3 100644
--- a/mm/mempool.c
+++ b/mm/mempool.c
@@ -365,6 +365,20 @@ int mempool_resize(mempool_t *pool, int new_min_nr)
}
EXPORT_SYMBOL(mempool_resize);
+/**
+ * mempool_use_prealloc_only - mark a pool to only use preallocated elements
+ * @pool: pointer to the memory pool that should be marked
+ *
+ * This function should only be called right after the pool creation via
+ * mempool_init() or mempool_create() and must not be called concurrently with
+ * mempool_alloc().
+ */
+void mempool_use_prealloc_only(mempool_t *pool)
+{
+ pool->use_prealloc_only = true;
+}
+EXPORT_SYMBOL(mempool_use_prealloc_only);
+
/**
* mempool_alloc - allocate an element from a specific memory pool
* @pool: pointer to the memory pool which was allocated via
@@ -397,9 +411,11 @@ void *mempool_alloc(mempool_t *pool, gfp_t gfp_mask)
repeat_alloc:
- element = pool->alloc(gfp_temp, pool->pool_data);
- if (likely(element != NULL))
- return element;
+ if (!pool->use_prealloc_only) {
+ element = pool->alloc(gfp_temp, pool->pool_data);
+ if (likely(element != NULL))
+ return element;
+ }
spin_lock_irqsave(&pool->lock, flags);
if (likely(pool->curr_nr)) {
@@ -415,6 +431,11 @@ void *mempool_alloc(mempool_t *pool, gfp_t gfp_mask)
return element;
}
+ if (pool->use_prealloc_only) {
+ spin_unlock_irqrestore(&pool->lock, flags);
+ return NULL;
+ }
+
/*
* We use gfp mask w/o direct reclaim or IO for the first round. If
* alloc failed with that and @pool was empty, retry immediately.
--
2.25.1
next prev parent reply other threads:[~2023-11-06 20:12 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-06 20:10 [PATCH RFC 00/20] kasan: save mempool stack traces andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 01/20] kasan: rename kasan_slab_free_mempool to kasan_mempool_poison_object andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 02/20] kasan: move kasan_mempool_poison_object andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 03/20] kasan: document kasan_mempool_poison_object andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 04/20] kasan: add return value for kasan_mempool_poison_object andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 05/20] kasan: introduce kasan_mempool_unpoison_object andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 06/20] kasan: introduce kasan_mempool_poison_pages andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 07/20] kasan: introduce kasan_mempool_unpoison_pages andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 08/20] kasan: clean up __kasan_mempool_poison_object andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 09/20] kasan: save free stack traces for slab mempools andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 10/20] kasan: clean up and rename ____kasan_kmalloc andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 11/20] kasan: introduce poison_kmalloc_large_redzone andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 12/20] kasan: save alloc stack traces for mempool andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 13/20] mempool: use new mempool KASAN hooks andrey.konovalov
2023-11-06 20:10 ` andrey.konovalov [this message]
2023-11-22 17:20 ` [PATCH RFC 14/20] mempool: introduce mempool_use_prealloc_only Marco Elver
2023-11-23 18:06 ` Andrey Konovalov
2023-11-23 18:47 ` Marco Elver
2023-11-06 20:10 ` [PATCH RFC 15/20] kasan: add mempool tests andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 16/20] kasan: rename pagealloc tests andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 17/20] kasan: reorder tests andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 18/20] kasan: rename and document kasan_(un)poison_object_data andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 19/20] skbuff: use mempool KASAN hooks andrey.konovalov
2023-11-06 20:10 ` [PATCH RFC 20/20] io_uring: use mempool KASAN hook andrey.konovalov
2023-11-22 17:13 ` [PATCH RFC 00/20] kasan: save mempool stack traces Marco Elver
2023-11-23 18:06 ` Andrey Konovalov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9752c5fc4763e7533a44a7c9368f056c47b52f34.1699297309.git.andreyknvl@google.com \
--to=andrey.konovalov@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=andreyknvl@gmail.com \
--cc=andreyknvl@google.com \
--cc=dvyukov@google.com \
--cc=elver@google.com \
--cc=eugenis@google.com \
--cc=glider@google.com \
--cc=kasan-dev@googlegroups.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ryabinin.a.a@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox