summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2026-07-06 15:09:15 +0100
committerMark Brown <broonie@kernel.org>2026-07-06 15:09:15 +0100
commit96243b9bca981659d489c74177555aef229aacbe (patch)
treec4dc02fed0d7bc9c65c3d651ebb82a8c6e43534b
parentf846843ca3daaddbdb297647cb3254d401d15ab9 (diff)
parentea0c7a9244594f1d71268e8636a8601217e4839d (diff)
downloadlinux-next-96243b9bca981659d489c74177555aef229aacbe.tar.gz
linux-next-96243b9bca981659d489c74177555aef229aacbe.zip
Merge branch 'slab/for-next' of https://git.kernel.org/pub/scm/linux/kernel/git/vbabka/slab.git
-rw-r--r--Documentation/ABI/testing/sysfs-kernel-slab18
-rw-r--r--Documentation/admin-guide/kernel-parameters.txt5
-rw-r--r--mm/mempool.c35
-rw-r--r--mm/slub.c46
4 files changed, 51 insertions, 53 deletions
diff --git a/Documentation/ABI/testing/sysfs-kernel-slab b/Documentation/ABI/testing/sysfs-kernel-slab
index b26e4299f822..c52034e3e794 100644
--- a/Documentation/ABI/testing/sysfs-kernel-slab
+++ b/Documentation/ABI/testing/sysfs-kernel-slab
@@ -113,8 +113,10 @@ KernelVersion: 2.6.22
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
Christoph Lameter <cl@gentwo.org>
Description:
- The cpu_slabs file is read-only and displays how many cpu slabs
- are active and their NUMA locality.
+ The cpu_slabs file is read-only. It is deprecated and always
+ reads "0" since the removal of per-cpu slabs in Linux 7.0. It
+ previously displayed how many cpu slabs were active and their
+ NUMA locality. The file is kept for backwards compatibility.
What: /sys/kernel/slab/<cache>/cpuslab_flush
Date: April 2009
@@ -509,12 +511,16 @@ What: /sys/kernel/slab/<cache>/slabs_cpu_partial
Date: Aug 2011
Contact: Christoph Lameter <cl@gentwo.org>
Description:
- This read-only file shows the number of partialli allocated
- frozen slabs.
+ This read-only file is deprecated and always reads "0(0)" since
+ the removal of per-cpu partial slabs in Linux 7.0. It previously
+ showed the number of partially allocated frozen slabs. The file
+ is kept for backwards compatibility.
What: /sys/kernel/slab/<cache>/cpu_partial
Date: Aug 2011
Contact: Christoph Lameter <cl@gentwo.org>
Description:
- This read-only file shows the number of per cpu partial
- pages to keep around.
+ This file is deprecated and always reads "0" since the removal of
+ per-cpu partial slabs in Linux 7.0. It previously showed the
+ number of per-cpu partial pages to keep around. The file is kept
+ for backwards compatibility.
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 731d39b7a18e..b2d7d3540ded 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -3980,6 +3980,11 @@ Kernel parameters
Note that even when enabled, there are a few cases where
the feature is not effective.
+ mempool_debug [MM]
+ Enable mempool debugging. This enables element
+ poison checking when freeing elements back to the
+ pool. Useful for debugging mempool corruption.
+
memtest= [KNL,X86,ARM,M68K,PPC,RISCV,EARLY] Enable memtest
Format: <integer>
default : 0 <disable>
diff --git a/mm/mempool.c b/mm/mempool.c
index 473a029fa31f..cb74e718b2c6 100644
--- a/mm/mempool.c
+++ b/mm/mempool.c
@@ -16,11 +16,28 @@
#include <linux/export.h>
#include <linux/mempool.h>
#include <linux/writeback.h>
+#include <linux/static_key.h>
+#include <linux/init.h>
#include "slab.h"
static DECLARE_FAULT_ATTR(fail_mempool_alloc);
static DECLARE_FAULT_ATTR(fail_mempool_alloc_bulk);
+/*
+ * Debugging support for mempool using static key.
+ *
+ * This allows enabling mempool debug at boot time via:
+ * mempool_debug
+ */
+static DEFINE_STATIC_KEY_FALSE(mempool_debug_enabled);
+
+static int __init mempool_debug_setup(char *str)
+{
+ static_branch_enable(&mempool_debug_enabled);
+ return 1;
+}
+__setup("mempool_debug", mempool_debug_setup);
+
static int __init mempool_faul_inject_init(void)
{
int error;
@@ -37,7 +54,6 @@ static int __init mempool_faul_inject_init(void)
}
late_initcall(mempool_faul_inject_init);
-#ifdef CONFIG_SLUB_DEBUG_ON
static void poison_error(struct mempool *pool, void *element, size_t size,
size_t byte)
{
@@ -140,14 +156,6 @@ static void poison_element(struct mempool *pool, void *element)
#endif
}
}
-#else /* CONFIG_SLUB_DEBUG_ON */
-static inline void check_element(struct mempool *pool, void *element)
-{
-}
-static inline void poison_element(struct mempool *pool, void *element)
-{
-}
-#endif /* CONFIG_SLUB_DEBUG_ON */
static __always_inline bool kasan_poison_element(struct mempool *pool,
void *element)
@@ -175,7 +183,10 @@ static void kasan_unpoison_element(struct mempool *pool, void *element)
static __always_inline void add_element(struct mempool *pool, void *element)
{
BUG_ON(pool->min_nr != 0 && pool->curr_nr >= pool->min_nr);
- poison_element(pool, element);
+
+ if (static_branch_unlikely(&mempool_debug_enabled))
+ poison_element(pool, element);
+
if (kasan_poison_element(pool, element))
pool->elements[pool->curr_nr++] = element;
}
@@ -186,7 +197,9 @@ static void *remove_element(struct mempool *pool)
BUG_ON(pool->curr_nr < 0);
kasan_unpoison_element(pool, element);
- check_element(pool, element);
+
+ if (static_branch_unlikely(&mempool_debug_enabled))
+ check_element(pool, element);
return element;
}
diff --git a/mm/slub.c b/mm/slub.c
index 9ec774dc7009..550efd79d146 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -4526,11 +4526,8 @@ success:
return object;
}
-static void *__slab_alloc_node(struct kmem_cache *s, gfp_t gfpflags, int node,
- const struct slab_alloc_context *ac)
+static __always_inline int apply_strict_numa_policy(int node)
{
- void *object;
-
#ifdef CONFIG_NUMA
if (static_branch_unlikely(&strict_numa) &&
node == NUMA_NO_NODE) {
@@ -4551,10 +4548,7 @@ static void *__slab_alloc_node(struct kmem_cache *s, gfp_t gfpflags, int node,
}
}
#endif
-
- object = ___slab_alloc(s, gfpflags, node, ac);
-
- return object;
+ return node;
}
static __fastpath_inline
@@ -4759,28 +4753,6 @@ void *alloc_from_pcs(struct kmem_cache *s, gfp_t gfp, unsigned int alloc_flags,
bool node_requested;
void *object;
-#ifdef CONFIG_NUMA
- if (static_branch_unlikely(&strict_numa) &&
- node == NUMA_NO_NODE) {
-
- struct mempolicy *mpol = current->mempolicy;
-
- if (mpol) {
- /*
- * Special BIND rule support. If the local node
- * is in permitted set then do not redirect
- * to a particular node.
- * Otherwise we apply the memory policy to get
- * the node we need to allocate on.
- */
- if (mpol->mode != MPOL_BIND ||
- !node_isset(numa_mem_id(), mpol->nodes))
-
- node = mempolicy_slab_node();
- }
- }
-#endif
-
node_requested = IS_ENABLED(CONFIG_NUMA) && node != NUMA_NO_NODE;
/*
@@ -4930,10 +4902,12 @@ static __fastpath_inline void *slab_alloc_node(struct kmem_cache *s,
if (unlikely(object))
goto out;
+ node = apply_strict_numa_policy(node);
+
object = alloc_from_pcs(s, gfpflags, ac->alloc_flags, node);
if (unlikely(!object))
- object = __slab_alloc_node(s, gfpflags, node, ac);
+ object = ___slab_alloc(s, gfpflags, node, ac);
maybe_wipe_obj_freeptr(s, object);
@@ -5416,6 +5390,8 @@ static void *__kmalloc_nolock_noprof(DECL_TOKEN_PARAMS(size, token), gfp_t gfp_f
if (!IS_ENABLED(CONFIG_SMP) && in_nmi())
return NULL;
+ node = apply_strict_numa_policy(node);
+
retry:
if (unlikely(size > KMALLOC_MAX_CACHE_SIZE))
return NULL;
@@ -5440,10 +5416,10 @@ retry:
/*
* Do not call slab_alloc_node(), since trylock mode isn't
* compatible with slab_pre_alloc_hook/should_failslab and
- * kfence_alloc. Hence call __slab_alloc_node() (at most twice)
+ * kfence_alloc. Hence call ___slab_alloc() (at most twice)
* and slab_post_alloc_hook() directly.
*/
- ret = __slab_alloc_node(s, gfp_flags, node, ac);
+ ret = ___slab_alloc(s, gfp_flags, node, ac);
/*
* It's possible we failed due to trylock as we preempted someone with
@@ -8992,14 +8968,12 @@ static void process_slab(struct loc_track *t, struct kmem_cache *s,
enum slab_stat_type {
SL_ALL, /* All slabs */
SL_PARTIAL, /* Only partially allocated slabs */
- SL_CPU, /* Only slabs used for cpu caches */
SL_OBJECTS, /* Determine allocated objects not slabs */
SL_TOTAL /* Determine object capacity not slabs */
};
#define SO_ALL (1 << SL_ALL)
#define SO_PARTIAL (1 << SL_PARTIAL)
-#define SO_CPU (1 << SL_CPU)
#define SO_OBJECTS (1 << SL_OBJECTS)
#define SO_TOTAL (1 << SL_TOTAL)
@@ -9188,7 +9162,7 @@ SLAB_ATTR_RO(partial);
static ssize_t cpu_slabs_show(struct kmem_cache *s, char *buf)
{
- return show_slab_objects(s, buf, SO_CPU);
+ return sysfs_emit(buf, "0\n");
}
SLAB_ATTR_RO(cpu_slabs);