All of lore.kernel.org
 help / color / mirror / Atom feed
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>,
	Breno Leitao <leitao@debian.org>,
	Alexander Lobakin <alobakin@pm.me>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	Andrey Konovalov <andreyknvl@google.com>
Subject: [PATCH mm 15/21] mempool: introduce mempool_use_prealloc_only
Date: Tue, 19 Dec 2023 23:28:59 +0100	[thread overview]
Message-ID: <a14d809dbdfd04cc33bcacc632fee2abd6b83c00.1703024586.git.andreyknvl@google.com> (raw)
In-Reply-To: <cover.1703024586.git.andreyknvl@google.com>

From: Andrey Konovalov <andreyknvl@google.com>

Introduce a new mempool_alloc_preallocated API that asks the mempool to
only use the elements preallocated during the mempool's creation when
allocating and to not attempt allocating new ones from the underlying
allocator.

This API is required to test the KASAN poisoning/unpoisoning
functionality in KASAN tests, but it might be also useful on its own.

Signed-off-by: Andrey Konovalov <andreyknvl@google.com>

---

Changes RFC->v1:
- Introduce a new mempool_alloc_preallocated API instead of adding a flag
  into mempool_t.
---
 include/linux/mempool.h |  1 +
 mm/mempool.c            | 37 +++++++++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git a/include/linux/mempool.h b/include/linux/mempool.h
index 4aae6c06c5f2..7be1e32e6d42 100644
--- a/include/linux/mempool.h
+++ b/include/linux/mempool.h
@@ -51,6 +51,7 @@ extern mempool_t *mempool_create_node(int min_nr, mempool_alloc_t *alloc_fn,
 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;
+extern void *mempool_alloc_preallocated(mempool_t *pool) __malloc;
 extern void mempool_free(void *element, mempool_t *pool);
 
 /*
diff --git a/mm/mempool.c b/mm/mempool.c
index 103dc4770cfb..cb7b4b56cec1 100644
--- a/mm/mempool.c
+++ b/mm/mempool.c
@@ -456,6 +456,43 @@ void *mempool_alloc(mempool_t *pool, gfp_t gfp_mask)
 }
 EXPORT_SYMBOL(mempool_alloc);
 
+/**
+ * mempool_alloc_preallocated - allocate an element from preallocated elements
+ *                              belonging to a specific memory pool
+ * @pool:      pointer to the memory pool which was allocated via
+ *             mempool_create().
+ *
+ * This function is similar to mempool_alloc, but it only attempts allocating
+ * an element from the preallocated elements. It does not sleep and immediately
+ * returns if no preallocated elements are available.
+ *
+ * Return: pointer to the allocated element or %NULL if no elements are
+ * available.
+ */
+void *mempool_alloc_preallocated(mempool_t *pool)
+{
+	void *element;
+	unsigned long flags;
+
+	spin_lock_irqsave(&pool->lock, flags);
+	if (likely(pool->curr_nr)) {
+		element = remove_element(pool);
+		spin_unlock_irqrestore(&pool->lock, flags);
+		/* paired with rmb in mempool_free(), read comment there */
+		smp_wmb();
+		/*
+		 * Update the allocation stack trace as this is more useful
+		 * for debugging.
+		 */
+		kmemleak_update_trace(element);
+		return element;
+	}
+	spin_unlock_irqrestore(&pool->lock, flags);
+
+	return NULL;
+}
+EXPORT_SYMBOL(mempool_alloc_preallocated);
+
 /**
  * mempool_free - return an element to the pool.
  * @element:   pool element pointer.
-- 
2.25.1


  parent reply	other threads:[~2023-12-19 22:31 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-19 22:28 [PATCH mm 00/21] kasan: save mempool stack traces andrey.konovalov
2023-12-19 22:28 ` [PATCH mm 01/21] kasan: rename kasan_slab_free_mempool to kasan_mempool_poison_object andrey.konovalov
2023-12-19 22:28 ` [PATCH mm 02/21] kasan: move kasan_mempool_poison_object andrey.konovalov
2023-12-19 22:28 ` [PATCH mm 03/21] kasan: document kasan_mempool_poison_object andrey.konovalov
2023-12-19 22:28 ` [PATCH mm 04/21] kasan: add return value for kasan_mempool_poison_object andrey.konovalov
2023-12-19 22:28 ` [PATCH mm 05/21] kasan: introduce kasan_mempool_unpoison_object andrey.konovalov
2023-12-19 22:28 ` [PATCH mm 06/21] kasan: introduce kasan_mempool_poison_pages andrey.konovalov
2023-12-19 22:28 ` [PATCH mm 07/21] kasan: introduce kasan_mempool_unpoison_pages andrey.konovalov
2023-12-19 22:28 ` [PATCH mm 08/21] kasan: clean up __kasan_mempool_poison_object andrey.konovalov
2023-12-19 22:28 ` [PATCH mm 09/21] kasan: save free stack traces for slab mempools andrey.konovalov
2023-12-19 22:28 ` [PATCH mm 10/21] kasan: clean up and rename ____kasan_kmalloc andrey.konovalov
2023-12-19 22:28 ` [PATCH mm 11/21] kasan: introduce poison_kmalloc_large_redzone andrey.konovalov
2023-12-19 22:28 ` [PATCH mm 12/21] kasan: save alloc stack traces for mempool andrey.konovalov
2023-12-19 22:28 ` [PATCH mm 13/21] mempool: skip slub_debug poisoning when KASAN is enabled andrey.konovalov
2023-12-19 22:28 ` [PATCH mm 14/21] mempool: use new mempool KASAN hooks andrey.konovalov
2023-12-19 22:28 ` andrey.konovalov [this message]
2023-12-19 22:29 ` [PATCH mm 16/21] kasan: add mempool tests andrey.konovalov
2023-12-19 22:29 ` [PATCH mm 17/21] kasan: rename pagealloc tests andrey.konovalov
2023-12-19 22:29 ` [PATCH mm 18/21] kasan: reorder tests andrey.konovalov
2023-12-19 22:29 ` [PATCH mm 19/21] kasan: rename and document kasan_(un)poison_object_data andrey.konovalov
2023-12-19 22:29 ` [PATCH mm 20/21] skbuff: use mempool KASAN hooks andrey.konovalov
2023-12-19 22:29 ` [PATCH mm 21/21] io_uring: use mempool KASAN hook andrey.konovalov
2024-01-02 12:54 ` [PATCH mm 00/21] kasan: save mempool stack traces Marco Elver

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=a14d809dbdfd04cc33bcacc632fee2abd6b83c00.1703024586.git.andreyknvl@google.com \
    --to=andrey.konovalov@linux.dev \
    --cc=akpm@linux-foundation.org \
    --cc=alobakin@pm.me \
    --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=leitao@debian.org \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.