]> www.infradead.org Git - nvme.git/commitdiff
zsmalloc: use unique zsmalloc caches names
authorSergey Senozhatsky <senozhatsky@chromium.org>
Fri, 6 Sep 2024 03:45:44 +0000 (12:45 +0900)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 17 Sep 2024 07:58:04 +0000 (00:58 -0700)
Each zsmalloc pool maintains several named kmem-caches for zs_handle-s and
zspage-s.  On a system with multiple zsmalloc pools and CONFIG_DEBUG_VM
this triggers kmem_cache_sanity_check():

  kmem_cache of name 'zspage' already exists
  WARNING: at mm/slab_common.c:108 do_kmem_cache_create_usercopy+0xb5/0x310
  ...

  kmem_cache of name 'zs_handle' already exists
  WARNING: at mm/slab_common.c:108 do_kmem_cache_create_usercopy+0xb5/0x310
  ...

We provide zram device name when init its zsmalloc pool, so we can use
that same name for zsmalloc caches and, hence, create unique names that
can easily be linked to zram device that has created them.

So instead of having this

cat /proc/slabinfo
slabinfo - version: 2.1
zspage                46     46    ...
zs_handle            128    128    ...
zspage             34270  34270    ...
zs_handle          34816  34816    ...
zspage                 0      0    ...
zs_handle              0      0    ...

We now have this

cat /proc/slabinfo
slabinfo - version: 2.1
zspage-zram2          46     46    ...
zs_handle-zram2      128    128    ...
zspage-zram0       34270  34270    ...
zs_handle-zram0    34816  34816    ...
zspage-zram1           0      0    ...
zs_handle-zram1        0      0    ...

Link: https://lkml.kernel.org/r/20240906035103.2435557-1-senozhatsky@chromium.org
Fixes: 2e40e163a25a ("zsmalloc: decouple handle and object")
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: Minchan Kim <minchan@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/zsmalloc.c

index 2d3163e4da96a565f7c2f8bcc6ac122ed64aa2f0..b572aa84823c331027e06a8f5af0097b01ad0ff1 100644 (file)
@@ -54,6 +54,7 @@
 #include <linux/vmalloc.h>
 #include <linux/preempt.h>
 #include <linux/spinlock.h>
+#include <linux/sprintf.h>
 #include <linux/shrinker.h>
 #include <linux/types.h>
 #include <linux/debugfs.h>
@@ -293,17 +294,27 @@ static void SetZsPageMovable(struct zs_pool *pool, struct zspage *zspage) {}
 
 static int create_cache(struct zs_pool *pool)
 {
-       pool->handle_cachep = kmem_cache_create("zs_handle", ZS_HANDLE_SIZE,
-                                       0, 0, NULL);
+       char *name;
+
+       name = kasprintf(GFP_KERNEL, "zs_handle-%s", pool->name);
+       if (!name)
+               return -ENOMEM;
+       pool->handle_cachep = kmem_cache_create(name, ZS_HANDLE_SIZE,
+                                               0, 0, NULL);
+       kfree(name);
        if (!pool->handle_cachep)
-               return 1;
+               return -EINVAL;
 
-       pool->zspage_cachep = kmem_cache_create("zspage", sizeof(struct zspage),
-                                       0, 0, NULL);
+       name = kasprintf(GFP_KERNEL, "zspage-%s", pool->name);
+       if (!name)
+               return -ENOMEM;
+       pool->zspage_cachep = kmem_cache_create(name, sizeof(struct zspage),
+                                               0, 0, NULL);
+       kfree(name);
        if (!pool->zspage_cachep) {
                kmem_cache_destroy(pool->handle_cachep);
                pool->handle_cachep = NULL;
-               return 1;
+               return -EINVAL;
        }
 
        return 0;