From: Kees Cook <kees@kernel.org>
To: Chris Down <chris@chrisdown.name>
Cc: Vlastimil Babka <vbabka@kernel.org>, Harry Yoo <harry@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Hao Li <hao.li@linux.dev>, Christoph Lameter <cl@gentwo.org>,
David Rientjes <rientjes@google.com>,
Roman Gushchin <roman.gushchin@linux.dev>,
Marco Elver <elver@google.com>,
GONG Ruiqi <gongruiqi@huaweicloud.com>,
Jonathan Corbet <corbet@lwn.net>,
linux-mm@kvack.org, linux-hardening@vger.kernel.org,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
kernel-team@meta.com
Subject: Re: [PATCH v2 3/6] mm/slab: Support disabling SLAB_BUCKETS at boot
Date: Fri, 30 Oct 2026 21:17:29 -0700 [thread overview]
Message-ID: <202610302115.8C7AD110@keescook> (raw)
In-Reply-To: <9a68a4d95830352ad3821437c2e22c30a673055b.1793253633.git.chris@chrisdown.name>
On Thu, Oct 29, 2026 at 02:08:25PM +0800, Chris Down wrote:
> SLAB_BUCKETS gives allocations with user-controlled size and contents,
> like memdup_user() and msg_msg, their own set of kmalloc caches, at the
> cost of the memory for those caches. It can only be chosen at build
> time, so hosts which want it and hosts which would rather not pay for it
> need separate kernels.
>
> Add a slab_buckets= early parameter, enabled by default on kernels built
> with CONFIG_SLAB_BUCKETS=y, so that it can be turned off at boot.
I thought the issue here was about calling convention (i.e. with
CONFIG_SLAB_BUCKETS Vlastimil had suggested making the argument lists
for the call chain shorter by dropping the bucket argument entirely).
>
> Signed-off-by: Chris Down <chris@chrisdown.name>
> ---
> .../admin-guide/kernel-parameters.txt | 8 ++++++
> mm/Kconfig | 4 +++
> mm/slab_common.c | 26 +++++++++++++++----
> 3 files changed, 33 insertions(+), 5 deletions(-)
>
> diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
> index 68647ff4bdd2..de2fd6963a16 100644
> --- a/Documentation/admin-guide/kernel-parameters.txt
> +++ b/Documentation/admin-guide/kernel-parameters.txt
> @@ -7001,6 +7001,14 @@ Kernel parameters
> apic=verbose is specified.
> Example: apic=debug show_lapic=all
>
> + slab_buckets= [MM,EARLY]
> + Format: <bool>
> + Enable or disable separate kmalloc buckets on kernels
> + built with CONFIG_SLAB_BUCKETS=y. When disabled,
> + allocations use regular kmalloc caches. Ignored
> + without that option.
> + Default: on.
> +
> slab_debug[=options[,slabs][;[options[,slabs]]...]] [MM]
> Enabling slab_debug allows one to determine the
> culprit if slab objects become corrupted. Enabling
> diff --git a/mm/Kconfig b/mm/Kconfig
> index 92ff97ff24fb..48078c1fd26f 100644
> --- a/mm/Kconfig
> +++ b/mm/Kconfig
> @@ -231,6 +231,10 @@ config SLAB_BUCKETS
> of extra pages since the bulk of user-controlled allocations
> are relatively long-lived.
>
> + The separate buckets can be disabled at boot with the
> + "slab_buckets=0" kernel parameter, in which case these
> + allocations use the regular kmalloc caches.
> +
> If unsure, say Y.
>
> config SLUB_STATS
> diff --git a/mm/slab_common.c b/mm/slab_common.c
> index e66c0778ee98..b7a46c368ab1 100644
> --- a/mm/slab_common.c
> +++ b/mm/slab_common.c
> @@ -410,6 +410,16 @@ EXPORT_SYMBOL(__kmem_cache_create_args);
>
> static struct kmem_cache *kmem_buckets_cache __ro_after_init;
>
> +static bool slab_buckets_enabled __ro_after_init = IS_ENABLED(CONFIG_SLAB_BUCKETS);
> +
> +#ifdef CONFIG_SLAB_BUCKETS
> +static int __init setup_slab_buckets(char *str)
> +{
> + return kstrtobool(str, &slab_buckets_enabled);
> +}
> +early_param("slab_buckets", setup_slab_buckets);
> +#endif
> +
> /**
> * kmem_buckets_create - Create a set of caches that handle dynamic sized
> * allocations via kmem_buckets_alloc()
> @@ -424,10 +434,12 @@ static struct kmem_cache *kmem_buckets_cache __ro_after_init;
> *
> * Context: Cannot be called within an interrupt, but can be interrupted.
> *
> - * Return: a pointer to the cache on success, NULL on failure. When
> - * CONFIG_SLAB_BUCKETS is not enabled, ZERO_SIZE_PTR is returned, and
> - * subsequent calls to kmem_buckets_alloc() will fall back to kmalloc().
> - * (i.e. callers only need to check for NULL on failure.)
> + * Return: a pointer to the cache on success, NULL on failure or when the
> + * separate buckets were disabled with the "slab_buckets=0" boot parameter.
> + * When CONFIG_SLAB_BUCKETS is not enabled, ZERO_SIZE_PTR is returned. In all
> + * of these cases subsequent calls to kmem_buckets_alloc() with the returned
> + * value fall back to kmalloc(), so callers that can live without separate
> + * buckets do not need to check the return value.
> */
> kmem_buckets *kmem_buckets_create(const char *name, slab_flags_t flags,
> unsigned int useroffset,
> @@ -448,6 +460,10 @@ kmem_buckets *kmem_buckets_create(const char *name, slab_flags_t flags,
> if (!IS_ENABLED(CONFIG_SLAB_BUCKETS))
> return ZERO_SIZE_PTR;
>
> + /* NULL makes kmalloc_slab() use the regular kmalloc caches. */
> + if (!slab_buckets_enabled)
> + return NULL;
Regardless, I still prefer this being a static branch so we don't end
up with a needless rodata global check.
> +
> if (WARN_ON(!kmem_buckets_cache))
> return NULL;
>
> @@ -1059,7 +1075,7 @@ void __init create_kmalloc_caches(void)
> /* Kmalloc array is now usable */
> slab_state = UP;
>
> - if (IS_ENABLED(CONFIG_SLAB_BUCKETS))
> + if (IS_ENABLED(CONFIG_SLAB_BUCKETS) && slab_buckets_enabled)
> kmem_buckets_cache = kmem_cache_create("kmalloc_buckets",
> sizeof(kmem_buckets),
> 0, SLAB_NO_MERGE, NULL);
> --
> 2.54.0
>
--
Kees Cook
next prev parent reply other threads:[~2026-10-31 4:17 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-29 6:07 [PATCH v2 0/6] mm/slab: Support selecting slab hardening features at boot Chris Down
2026-10-29 6:07 ` [PATCH v2 1/6] mm/slab: Enable SLAB_FREELIST_HARDENED by default Chris Down
2026-10-31 4:13 ` Kees Cook
2026-10-29 6:07 ` [PATCH v2 2/6] mm/slab: Enable SLAB_FREELIST_RANDOM " Chris Down
2026-10-31 4:15 ` Kees Cook
2026-10-29 6:08 ` [PATCH v2 3/6] mm/slab: Support disabling SLAB_BUCKETS at boot Chris Down
2026-10-31 4:17 ` Kees Cook [this message]
2026-10-29 6:08 ` [PATCH v2 4/6] slub_kunit: Add a test for the slab_buckets boot parameter Chris Down
2026-10-31 4:22 ` Kees Cook
2026-10-29 6:09 ` [PATCH v2 5/6] mm/slab: Support disabling KMALLOC_PARTITION_CACHES at boot Chris Down
2026-10-31 4:28 ` Kees Cook
2026-10-29 6:09 ` [PATCH v2 6/6] slub_kunit: Add a test for the kmalloc_partition boot parameter Chris Down
2026-10-31 4:29 ` Kees Cook
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=202610302115.8C7AD110@keescook \
--to=kees@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=chris@chrisdown.name \
--cc=cl@gentwo.org \
--cc=corbet@lwn.net \
--cc=elver@google.com \
--cc=gongruiqi@huaweicloud.com \
--cc=hao.li@linux.dev \
--cc=harry@kernel.org \
--cc=kernel-team@meta.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=rientjes@google.com \
--cc=roman.gushchin@linux.dev \
--cc=vbabka@kernel.org \
/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.