]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mm/slab: factor out slab_args_unmergeable()
authorHarry Yoo <harry.yoo@oracle.com>
Tue, 27 Jan 2026 10:31:50 +0000 (19:31 +0900)
committerVlastimil Babka <vbabka@suse.cz>
Tue, 27 Jan 2026 16:59:38 +0000 (17:59 +0100)
slab_mergeable() determines whether a slab cache can be merged, but it
should not be used when the cache is not fully created yet.

Extract the pre-cache-creation mergeability checks into
slab_args_unmergeable(), which evaluates kmem_cache_args, slab flags,
and slab_nomerge to determine if a cache will be mergeable before it is
created.

Signed-off-by: Harry Yoo <harry.yoo@oracle.com>
Link: https://patch.msgid.link/20260127103151.21883-2-harry.yoo@oracle.com
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
mm/slab_common.c

index 5c15a4ce5743264b794b6e9ef480af292eed4715..b6836f8500b684b0f74c1c3107d1bb07f46a7005 100644 (file)
@@ -171,24 +171,32 @@ int slab_unmergeable(struct kmem_cache *s)
        return 0;
 }
 
-static struct kmem_cache *find_mergeable(unsigned int size, slab_flags_t flags,
-               const char *name, struct kmem_cache_args *args)
+static bool slab_args_unmergeable(struct kmem_cache_args *args,
+                                 slab_flags_t flags)
 {
-       struct kmem_cache *s;
-       unsigned int align;
-
        if (slab_nomerge)
-               return NULL;
+               return true;
 
        if (args->ctor)
-               return NULL;
+               return true;
 
        if (IS_ENABLED(CONFIG_HARDENED_USERCOPY) && args->usersize)
-               return NULL;
-
-       flags = kmem_cache_flags(flags, name);
+               return true;
 
        if (flags & SLAB_NEVER_MERGE)
+               return true;
+
+       return false;
+}
+
+static struct kmem_cache *find_mergeable(unsigned int size, slab_flags_t flags,
+               const char *name, struct kmem_cache_args *args)
+{
+       struct kmem_cache *s;
+       unsigned int align;
+
+       flags = kmem_cache_flags(flags, name);
+       if (slab_args_unmergeable(args, flags))
                return NULL;
 
        size = ALIGN(size, sizeof(void *));