Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cbb79694 authored by Christoph Lameter's avatar Christoph Lameter Committed by Pekka Enberg
Browse files

mm/sl[aou]b: Do slab aliasing call from common code



The slab aliasing logic causes some strange contortions in slub. So add
a call to deal with aliases to slab_common.c but disable it for other
slab allocators by providng stubs that fail to create aliases.

Full general support for aliases will require additional cleanup passes
and more standardization of fields in kmem_cache.

Signed-off-by: default avatarChristoph Lameter <cl@linux.com>
Signed-off-by: default avatarPekka Enberg <penberg@kernel.org>
parent db265eca
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -36,6 +36,16 @@ extern struct kmem_cache *kmem_cache;
struct kmem_cache *__kmem_cache_create(const char *name, size_t size,
	size_t align, unsigned long flags, void (*ctor)(void *));

#ifdef CONFIG_SLUB
struct kmem_cache *__kmem_cache_alias(const char *name, size_t size,
	size_t align, unsigned long flags, void (*ctor)(void *));
#else
static inline struct kmem_cache *__kmem_cache_alias(const char *name, size_t size,
	size_t align, unsigned long flags, void (*ctor)(void *))
{ return NULL; }
#endif


int __kmem_cache_shutdown(struct kmem_cache *);

#endif
+4 −0
Original line number Diff line number Diff line
@@ -115,6 +115,10 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align
		goto out_locked;
	}

	s = __kmem_cache_alias(name, size, align, flags, ctor);
	if (s)
		goto out_locked;

	s = __kmem_cache_create(n, size, align, flags, ctor);

	if (s) {
+11 −4
Original line number Diff line number Diff line
@@ -3922,7 +3922,7 @@ static struct kmem_cache *find_mergeable(size_t size,
	return NULL;
}

struct kmem_cache *__kmem_cache_create(const char *name, size_t size,
struct kmem_cache *__kmem_cache_alias(const char *name, size_t size,
		size_t align, unsigned long flags, void (*ctor)(void *))
{
	struct kmem_cache *s;
@@ -3939,11 +3939,18 @@ struct kmem_cache *__kmem_cache_create(const char *name, size_t size,

		if (sysfs_slab_alias(s, name)) {
			s->refcount--;
			return NULL;
			s = NULL;
		}
	}

	return s;
}

struct kmem_cache *__kmem_cache_create(const char *name, size_t size,
		size_t align, unsigned long flags, void (*ctor)(void *))
{
	struct kmem_cache *s;

	s = kmem_cache_alloc(kmem_cache, GFP_KERNEL);
	if (s) {
		if (kmem_cache_open(s, name,