Commit d907bf43 authored by Harry Yoo's avatar Harry Yoo Committed by Vlastimil Babka
Browse files

mm/slab: factor out slab_args_unmergeable()



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: default avatarHarry Yoo <harry.yoo@oracle.com>
Link: https://patch.msgid.link/20260127103151.21883-2-harry.yoo@oracle.com


Signed-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
parent aff85185
Loading
Loading
Loading
Loading
+18 −10
Original line number Diff line number Diff line
@@ -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 *));