]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
mm/slab: return NULL early from kmalloc_nolock() in NMI on UP
authorHarry Yoo (Oracle) <harry@kernel.org>
Mon, 27 Apr 2026 07:09:53 +0000 (16:09 +0900)
committerVlastimil Babka (SUSE) <vbabka@kernel.org>
Mon, 27 Apr 2026 07:14:36 +0000 (09:14 +0200)
commit5b31044e649e3e54c2caef135c09b371c2fbcd08
tree27eaf17c1d23a8dac131c644bc9eb1dc9accc65e
parent620b46ed6ae17c8438d889c8c0cfddab36a1476c
mm/slab: return NULL early from kmalloc_nolock() in NMI on UP

On UP kernels (!CONFIG_SMP), spin_trylock() is a no-op that
unconditionally succeeds even when the lock is already held. As a
result, kmalloc_nolock() called from NMI context can re-enter the slab
allocator and acquire n->list_lock that the interrupted context is
already holding, corrupting slab state.

With CONFIG_DEBUG_SPINLOCK on UP, the following BUG is triggered with
the slub_kunit test module:

  BUG: spinlock trylock failure on UP on CPU#0, kunit_try_catch/243
  [...]
  Call Trace:
   <NMI>
   dump_stack_lvl+0x3f/0x60
   do_raw_spin_trylock+0x41/0x50
   _raw_spin_trylock+0x24/0x50
   get_from_partial_node+0x120/0x4d0
   ___slab_alloc+0x8a/0x4c0
   kmalloc_nolock_noprof+0x164/0x310
   [...]
   </NMI>

Fix this by returning NULL early when invoked from NMI on a UP kernel.

Link: https://lore.kernel.org/linux-mm/ad_cqe51pvr1WaDg@hyeyoo
Cc: stable@vger.kernel.org
Fixes: af92793e52c3 ("slab: Introduce kmalloc_nolock() and kfree_nolock().")
Signed-off-by: Harry Yoo (Oracle) <harry@kernel.org>
Link: https://patch.msgid.link/20260427-nolock-api-fix-v2-2-a6b83a92d9a4@kernel.org
Signed-off-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
mm/slub.c