mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 04:38:03 +00:00
zsmalloc: use unique zsmalloc caches names
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: 2e40e163a2
("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>
This commit is contained in:
parent
fb497d6db7
commit
6040f650c5
@ -54,6 +54,7 @@
|
|||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include <linux/preempt.h>
|
#include <linux/preempt.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
|
#include <linux/sprintf.h>
|
||||||
#include <linux/shrinker.h>
|
#include <linux/shrinker.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/debugfs.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)
|
static int create_cache(struct zs_pool *pool)
|
||||||
{
|
{
|
||||||
pool->handle_cachep = kmem_cache_create("zs_handle", ZS_HANDLE_SIZE,
|
char *name;
|
||||||
0, 0, NULL);
|
|
||||||
if (!pool->handle_cachep)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
pool->zspage_cachep = kmem_cache_create("zspage", sizeof(struct zspage),
|
name = kasprintf(GFP_KERNEL, "zs_handle-%s", pool->name);
|
||||||
0, 0, NULL);
|
if (!name)
|
||||||
|
return -ENOMEM;
|
||||||
|
pool->handle_cachep = kmem_cache_create(name, ZS_HANDLE_SIZE,
|
||||||
|
0, 0, NULL);
|
||||||
|
kfree(name);
|
||||||
|
if (!pool->handle_cachep)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
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) {
|
if (!pool->zspage_cachep) {
|
||||||
kmem_cache_destroy(pool->handle_cachep);
|
kmem_cache_destroy(pool->handle_cachep);
|
||||||
pool->handle_cachep = NULL;
|
pool->handle_cachep = NULL;
|
||||||
return 1;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user