summaryrefslogtreecommitdiff
path: root/mm
diff options
context:
space:
mode:
authorUladzislau Rezki (Sony) <urezki@gmail.com>2026-04-28 18:14:18 +0200
committerHerbert Xu <herbert@gondor.apana.org.au>2026-05-05 16:12:07 +0800
commitdad0d91cc2c3e6b6fb285ccfe7ddf71525797198 (patch)
treec79f99c2bea8980aa044feab8bf3baedb7c3619a /mm
parent09ae540e1d5c02210795911bf5459282d7af04e9 (diff)
downloadlinux-next-dad0d91cc2c3e6b6fb285ccfe7ddf71525797198.tar.gz
linux-next-dad0d91cc2c3e6b6fb285ccfe7ddf71525797198.zip
mm/slab: Add kvfree_atomic() helper
kvmalloc() now supports non-sleeping GFP flags, including the vmalloc fallback path. This means it may return vmalloc memory even for GFP_ATOMIC and GFP_NOWAIT allocations. Freeing such memory with kvfree() may then end up calling vfree(), which is not safe for non-sleeping contexts. Introduce kvfree_atomic() helper for such cases. It mirrors kvfree(), but uses vfree_atomic() for vmalloced memory. Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com> Acked-by: Vlastimil Babka (SUSE) <vbabka@kernel.org> Acked-by: Harry Yoo (Oracle) <harry@kernel.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'mm')
-rw-r--r--mm/slub.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/mm/slub.c b/mm/slub.c
index 0baa906f39ab..8f9004536729 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -6883,6 +6883,22 @@ void kvfree(const void *addr)
EXPORT_SYMBOL(kvfree);
/**
+ * kvfree_atomic() - Free memory.
+ * @addr: Pointer to allocated memory.
+ *
+ * Same as kvfree(), but uses vfree_atomic() for vmalloc
+ * backed memory. Must not be called from NMI context.
+ */
+void kvfree_atomic(const void *addr)
+{
+ if (is_vmalloc_addr(addr))
+ vfree_atomic(addr);
+ else
+ kfree(addr);
+}
+EXPORT_SYMBOL(kvfree_atomic);
+
+/**
* kvfree_sensitive - Free a data object containing sensitive information.
* @addr: address of the data object to be freed.
* @len: length of the data object.