Re: [PATCH v3] mm/zsmalloc: remove CONFIG_ZSMALLOC_STAT

From: Xueyuan Chen

Date: Fri Nov 13 2026 - 12:22:37 EST


On 2026-11-13 10:12 +0800, Dongliang Mu wrote:
>
> On 11/11/26 8:41 PM, Xueyuan Chen wrote:
> > CONFIG_ZSMALLOC_STAT only controls the debugfs interface. The class
> > counters are updated regardless of this option.
> >
> > Remove the CONFIG_ZSMALLOC_STAT guards and rely on the debugfs API
> > stubs when CONFIG_DEBUG_FS=n. Skip statistics setup silently when
> > debugfs is unavailable.
> >
> > Remove the Kconfig entry and replace the existing CONFIG_ZSMALLOC_STAT
> > settings with CONFIG_DEBUG_FS=y. Update the English and Chinese
> > documentation to match, and clarify the pool name in the debugfs path.
> >
> > Suggested-by: Nhat Pham <nphamcs@xxxxxxxxx>
> > Reviewed-by: Nhat Pham <nphamcs@xxxxxxxxx>
> > Signed-off-by: Xueyuan Chen <xueyuan.chen21@xxxxxxxxx>
>
> |The documentation changes look good to me. Acked-by: Dongliang Mu
> <dzm91@xxxxxxxxxxx> # Documentation|
thanks!
>
> > ---
> > Drop CONFIG_ZSMALLOC_STAT instead of making the counters conditional. The
> > option only controls the debugfs interface, while the class counters are
> > updated unconditionally. Removing it simplifies the code.
> >
> > Following Nhat's suggestion, remove CONFIG_ZSMALLOC_STAT and rely on
> > the existing debugfs API stubs when CONFIG_DEBUG_FS=n.
> > ---
> > Changes in v3:
> > - Squash the three patches into one (Nhat, Sergey).
> > - Add Nhat's Reviewed-by.
> > - Update the documentation wording.
> > - Link to v2: https://patch.msgid.link/20261109-zsmalloc_stat-v2-0-caee41684aba@xxxxxxxxx
> >
> > Changes in v2:
> > - Drop CONFIG_ZSMALLOC_STAT instead of making the counters conditional.
> > - Update configuration files and documentation.
> > - Link to v1: https://patch.msgid.link/20261106-zsmalloc_stat-v1-1-b574f4714adf@xxxxxxxxx
> > ---
> > Documentation/mm/zsmalloc.rst | 4 +--
> > Documentation/translations/zh_CN/mm/zsmalloc.rst | 2 +-
> > arch/s390/configs/debug_defconfig | 2 +-
> > arch/s390/configs/defconfig | 2 +-
> > drivers/gpu/drm/ci/arm.config | 2 +-
> > drivers/gpu/drm/ci/arm64.config | 2 +-
> > drivers/gpu/drm/ci/x86_64.config | 2 +-
> > mm/Kconfig | 9 -------
> > mm/zsmalloc.c | 33 ++----------------------
> > 9 files changed, 10 insertions(+), 48 deletions(-)
> >
> > diff --git a/Documentation/mm/zsmalloc.rst b/Documentation/mm/zsmalloc.rst
> > index d2bbecd78e14..4c0786378dc3 100644
> > --- a/Documentation/mm/zsmalloc.rst
> > +++ b/Documentation/mm/zsmalloc.rst
> > @@ -33,8 +33,8 @@ proper handle-based APIs.
> > stat
> > ====
> >
> > -With CONFIG_ZSMALLOC_STAT, we could see zsmalloc internal information via
> > -``/sys/kernel/debug/zsmalloc/<user name>``. Here is a sample of stat output::
> > +With CONFIG_DEBUG_FS, we could see zsmalloc internal information via
> > +``/sys/kernel/debug/zsmalloc/<pool-name>``. Here is a sample of stat output::
> >
> > # cat /sys/kernel/debug/zsmalloc/zram0/classes
> >
> > diff --git a/Documentation/translations/zh_CN/mm/zsmalloc.rst b/Documentation/translations/zh_CN/mm/zsmalloc.rst
> > index 4c8c9b1006a9..b555a07ac871 100644
> > --- a/Documentation/translations/zh_CN/mm/zsmalloc.rst
> > +++ b/Documentation/translations/zh_CN/mm/zsmalloc.rst
> > @@ -32,7 +32,7 @@ zs_unmap_object()解除映射。
> > stat
> > ====
> >
> > -通过CONFIG_ZSMALLOC_STAT,我们可以通过 ``/sys/kernel/debug/zsmalloc/<user name>``
> > +启用CONFIG_DEBUG_FS,我们可以通过 ``/sys/kernel/debug/zsmalloc/<pool-name>``
> > 看到zsmalloc内部信息。下面是一个统计输出的例子。::
> >
> > # cat /sys/kernel/debug/zsmalloc/zram0/classes
> > diff --git a/arch/s390/configs/debug_defconfig b/arch/s390/configs/debug_defconfig
> > index d44674b63715..83193ef8efb9 100644
> > --- a/arch/s390/configs/debug_defconfig
> > +++ b/arch/s390/configs/debug_defconfig
> > @@ -100,7 +100,7 @@ CONFIG_UNIXWARE_DISKLABEL=y
> > CONFIG_IOSCHED_BFQ=y
> > CONFIG_BINFMT_MISC=m
> > CONFIG_ZSWAP=y
> > -CONFIG_ZSMALLOC_STAT=y
> > +CONFIG_DEBUG_FS=y
> > CONFIG_SLAB_BUCKETS=y
> > CONFIG_SLUB_STATS=y
> > # CONFIG_COMPAT_BRK is not set
> > diff --git a/arch/s390/configs/defconfig b/arch/s390/configs/defconfig
> > index e00e252d4694..694a309377d5 100644
> > --- a/arch/s390/configs/defconfig
> > +++ b/arch/s390/configs/defconfig
> > @@ -94,7 +94,7 @@ CONFIG_UNIXWARE_DISKLABEL=y
> > CONFIG_IOSCHED_BFQ=y
> > CONFIG_BINFMT_MISC=m
> > CONFIG_ZSWAP=y
> > -CONFIG_ZSMALLOC_STAT=y
> > +CONFIG_DEBUG_FS=y
> > CONFIG_SLAB_BUCKETS=y
> > # CONFIG_COMPAT_BRK is not set
> > CONFIG_MEMORY_HOTPLUG=y
> > diff --git a/drivers/gpu/drm/ci/arm.config b/drivers/gpu/drm/ci/arm.config
> > index d7c51670da2f..fc0a8a4bfb18 100644
> > --- a/drivers/gpu/drm/ci/arm.config
> > +++ b/drivers/gpu/drm/ci/arm.config
> > @@ -5,7 +5,7 @@ CONFIG_CRYPTO_ZSTD=y
> > CONFIG_ZRAM_MEMORY_TRACKING=y
> > CONFIG_ZRAM_WRITEBACK=y
> > CONFIG_ZRAM=y
> > -CONFIG_ZSMALLOC_STAT=y
> > +CONFIG_DEBUG_FS=y
> >
> > # abootimg with a 'dummy' rootfs fails with root=/dev/nfs
> > CONFIG_BLK_DEV_INITRD=n
> > diff --git a/drivers/gpu/drm/ci/arm64.config b/drivers/gpu/drm/ci/arm64.config
> > index c46125c1f80f..10b01b55a66d 100644
> > --- a/drivers/gpu/drm/ci/arm64.config
> > +++ b/drivers/gpu/drm/ci/arm64.config
> > @@ -5,7 +5,7 @@ CONFIG_CRYPTO_ZSTD=y
> > CONFIG_ZRAM_MEMORY_TRACKING=y
> > CONFIG_ZRAM_WRITEBACK=y
> > CONFIG_ZRAM=y
> > -CONFIG_ZSMALLOC_STAT=y
> > +CONFIG_DEBUG_FS=y
> >
> > # abootimg with a 'dummy' rootfs fails with root=/dev/nfs
> > CONFIG_BLK_DEV_INITRD=n
> > diff --git a/drivers/gpu/drm/ci/x86_64.config b/drivers/gpu/drm/ci/x86_64.config
> > index 7ac98a78691e..8225b806dad8 100644
> > --- a/drivers/gpu/drm/ci/x86_64.config
> > +++ b/drivers/gpu/drm/ci/x86_64.config
> > @@ -5,7 +5,7 @@ CONFIG_CRYPTO_ZSTD=y
> > CONFIG_ZRAM_MEMORY_TRACKING=y
> > CONFIG_ZRAM_WRITEBACK=y
> > CONFIG_ZRAM=y
> > -CONFIG_ZSMALLOC_STAT=y
> > +CONFIG_DEBUG_FS=y
> >
> > CONFIG_PWM=y
> > CONFIG_PM_DEVFREQ=y
> > diff --git a/mm/Kconfig b/mm/Kconfig
> > index afff1b25b543..4a77cda7f1d7 100644
> > --- a/mm/Kconfig
> > +++ b/mm/Kconfig
> > @@ -130,15 +130,6 @@ menu "Zsmalloc allocator options"
> >
> > comment "Zsmalloc is a common backend allocator for zswap & zram"
> >
> > -config ZSMALLOC_STAT
> > - bool "Export zsmalloc statistics"
> > - select DEBUG_FS
> > - help
> > - This option enables code in the zsmalloc to collect various
> > - statistics about what's happening in zsmalloc and exports that
> > - information to userspace via debugfs.
> > - If unsure, say N.
> > -
> > config ZSMALLOC_CHAIN_SIZE
> > int "Maximum number of physical pages per-zspage"
> > default 8
> > diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
> > index 7ef80e0da626..104ccf3aa170 100644
> > --- a/mm/zsmalloc.c
> > +++ b/mm/zsmalloc.c
> > @@ -222,9 +222,7 @@ struct zs_size_stat {
> > unsigned long objs[NR_CLASS_STAT_TYPES];
> > };
> >
> > -#ifdef CONFIG_ZSMALLOC_STAT
> > static struct dentry *zs_stat_root;
> > -#endif
> >
> > static size_t huge_class_size;
> >
> > @@ -279,9 +277,7 @@ struct zs_pool {
> > /* Compact classes */
> > struct shrinker *shrinker;
> >
> > -#ifdef CONFIG_ZSMALLOC_STAT
> > struct dentry *stat_dentry;
> > -#endif
> > #ifdef CONFIG_COMPACTION
> > struct work_struct free_work;
> > #endif
> > @@ -565,14 +561,10 @@ static inline unsigned long class_stat_read(struct size_class *class, int type)
> > return class->stats.objs[type];
> > }
> >
> > -#ifdef CONFIG_ZSMALLOC_STAT
> > -
> > static void __init zs_stat_init(void)
> > {
> > - if (!debugfs_initialized()) {
> > - pr_warn("debugfs not available, stat dir not created\n");
> > + if (!debugfs_initialized())
> > return;
> > - }
> >
> > zs_stat_root = debugfs_create_dir("zsmalloc", NULL);
> > }
> > @@ -650,10 +642,8 @@ DEFINE_SHOW_ATTRIBUTE(zs_stats_size);
> >
> > static void zs_pool_stat_create(struct zs_pool *pool, const char *name)
> > {
> > - if (!zs_stat_root) {
> > - pr_warn("no root stat dir, not creating <%s> stat dir\n", name);
> > + if (IS_ERR_OR_NULL(zs_stat_root))
> > return;
> > - }
> >
> > pool->stat_dentry = debugfs_create_dir(name, zs_stat_root);
> >
> > @@ -666,25 +656,6 @@ static void zs_pool_stat_destroy(struct zs_pool *pool)
> > debugfs_remove_recursive(pool->stat_dentry);
> > }
> >
> > -#else /* CONFIG_ZSMALLOC_STAT */
> > -static void __init zs_stat_init(void)
> > -{
> > -}
> > -
> > -static void __exit zs_stat_exit(void)
> > -{
> > -}
> > -
> > -static inline void zs_pool_stat_create(struct zs_pool *pool, const char *name)
> > -{
> > -}
> > -
> > -static inline void zs_pool_stat_destroy(struct zs_pool *pool)
> > -{
> > -}
> > -#endif
> > -
> > -
> > /*
> > * For each size class, zspages are divided into different groups
> > * depending on their usage ratio. This function returns fullness
> >
> > ---
> > base-commit: fa4ad798f6f681031775266044ba1b0cf3c670bd
> >
> > --
> > Best regards,
> > Xueyuan
>
>