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 *));