CONFIG_SLUB_TINY was introduced to help tiny systems migrate away from
the SLOB implementation so it could be removed. Its main purpose has
been to disable all forms of percpu object caching (cpu slabs back then,
now sheaves), and being a compile-time config option, some extra minor
saving were achieved by code elimination or more agressive merging of
caches with reclaimable and non-reclaimable objects (keeping those
separate helps reduce high-order page fragmentation but not memory
footprint.
However being a config option brings issues such as incompatibility with
other options that has caused troubles in the past and Linus argued for
removing it [1]. Moreover, there is a use case for having full-blown
scalable implementation enabled and being able to disable it with a
boot-time rather than compile-time decision. That ise base is the kdump
kernel which shares the same vmlinux but wants to minimize the memory
overhead (which has to be pre-reserved from the production kernel) and
does not mind reduced scalability.
Thus this series reworks the CONFIG_SLUB_TINY to be controlled by a
variable set by a boot-time parameter. The config option itself is
deprecated and only sets the default value of the variable, and all its
interactions with other config options are removed.
The conversion builds mainly on the fact that most SLUB_TINY specific
paths to avoiding percpu object caching are shared with slab_debug
handling, except doing any actual debugging checks.
Thus introduce slab_debug=N (for No-op) option to allow using the
slab_debug checks directly, and extract the underlying static key
handling from CONFIG_SLUB_DEBUG only scope. The decision to create
separate kmalloc-rcl caches is also made to be boot-time.
The parts of CONFIG_SLUB_TINY that can't be transformed to a boot-time
decision are related to dead code elimination and fast path inlining,
merging of non-kmalloc reclaimable and unreclaimable caches, and
ignoring SLAB_NO_MERGE for performance purposes (currently used in
networking). Those lost memory saving should be all relatively minor
compared to the savings from avoiding percpu caching.
To sum up, after this series:
- CONFIG_SLUB_TINY is a deprecated option that has no interaction with
other options and only controls the default behavior.
- New slab_tiny boot parameter controls the functionality (and can
override CONFIG_SLUB_TINY in both directions).
- slab_debug=N can effectively achieve most of slab_tiny and on a
per-cache basic
- the implementation is simpler with many ifdefs removed
[1] https://lore.kernel.org/all/CAHk-=wh-k04MsoEC0SGKff2Snm6bBF_e+0pHOKwaWv4umZ_SnQ@mail.gmail.com/
Signed-off-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
---
Vlastimil Babka (SUSE) (8):
mm, slab: refactor slab_min/max_order handling
mm, slab: introduce slab_debug=N
mm, slab: rework KMALLOC_RECLAIM handling of SLUB_TINY
mm, slab: make SLUB_TINY handling dynamic for sizing decisions
mm, slab: convert CONFIG_SLUB_TINY checks to kmem_cache_debug()
mm, slab: remove remaining compile-time checks for CONFIG_SLUB_TINY
mm, slab: add slab_tiny boot param
mm, slab: deprecate CONFIG_SLUB_TINY and reduce its Kconfig effects
Documentation/admin-guide/kernel-parameters.txt | 4 +
Documentation/admin-guide/mm/slab.rst | 18 ++-
include/linux/slab.h | 17 +--
lib/Kconfig.kasan | 2 +-
mm/Kconfig | 16 ++-
mm/Kconfig.debug | 2 +-
mm/slab.h | 32 +++--
mm/slab_common.c | 12 +-
mm/slub.c | 149 +++++++++++-------------
9 files changed, 120 insertions(+), 132 deletions(-)
---
base-commit: b4218126d498275444f315b0ed4cef6add6beabc
change-id: 20260911-slub_tiny_rework-8f2634dd17a7