Skip to content

Commit

Permalink
slab: create kmem_cache_create() compatibility layer
Browse files Browse the repository at this point in the history
Use _Generic() to create a compatibility layer that type switches on the
third argument to either call __kmem_cache_create() or
__kmem_cache_create_args(). If NULL is passed for the struct
kmem_cache_args argument use default args making porting for callers
that don't care about additional arguments easy.

Reviewed-by: Kees Cook <kees@kernel.org>
Reviewed-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Christian Brauner <brauner@kernel.org>
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: Roman Gushchin <roman.gushchin@linux.dev>
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
  • Loading branch information
brauner authored and tehcaster committed Sep 10, 2024
1 parent 199cd13 commit b2e7456
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 8 deletions.
29 changes: 26 additions & 3 deletions include/linux/slab.h
Original file line number Diff line number Diff line change
Expand Up @@ -262,9 +262,10 @@ struct kmem_cache *__kmem_cache_create_args(const char *name,
unsigned int object_size,
struct kmem_cache_args *args,
slab_flags_t flags);
struct kmem_cache *kmem_cache_create(const char *name, unsigned int size,
unsigned int align, slab_flags_t flags,
void (*ctor)(void *));

struct kmem_cache *__kmem_cache_create(const char *name, unsigned int size,
unsigned int align, slab_flags_t flags,
void (*ctor)(void *));
struct kmem_cache *kmem_cache_create_usercopy(const char *name,
unsigned int size, unsigned int align,
slab_flags_t flags,
Expand All @@ -273,6 +274,28 @@ struct kmem_cache *kmem_cache_create_usercopy(const char *name,
struct kmem_cache *kmem_cache_create_rcu(const char *name, unsigned int size,
unsigned int freeptr_offset,
slab_flags_t flags);

/* If NULL is passed for @args, use this variant with default arguments. */
static inline struct kmem_cache *
__kmem_cache_default_args(const char *name, unsigned int size,
struct kmem_cache_args *args,
slab_flags_t flags)
{
struct kmem_cache_args kmem_default_args = {};

/* Make sure we don't get passed garbage. */
if (WARN_ON_ONCE(args))
return ERR_PTR(-EINVAL);

return __kmem_cache_create_args(name, size, &kmem_default_args, flags);
}

#define kmem_cache_create(__name, __object_size, __args, ...) \
_Generic((__args), \
struct kmem_cache_args *: __kmem_cache_create_args, \
void *: __kmem_cache_default_args, \
default: __kmem_cache_create)(__name, __object_size, __args, __VA_ARGS__)

void kmem_cache_destroy(struct kmem_cache *s);
int kmem_cache_shrink(struct kmem_cache *s);

Expand Down
10 changes: 5 additions & 5 deletions mm/slab_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ kmem_cache_create_usercopy(const char *name, unsigned int size,
EXPORT_SYMBOL(kmem_cache_create_usercopy);

/**
* kmem_cache_create - Create a cache.
* __kmem_cache_create - Create a cache.
* @name: A string which is used in /proc/slabinfo to identify this cache.
* @size: The size of objects to be created in this cache.
* @align: The required alignment for the objects.
Expand All @@ -407,9 +407,9 @@ EXPORT_SYMBOL(kmem_cache_create_usercopy);
*
* Return: a pointer to the cache on success, NULL on failure.
*/
struct kmem_cache *
kmem_cache_create(const char *name, unsigned int size, unsigned int align,
slab_flags_t flags, void (*ctor)(void *))
struct kmem_cache *__kmem_cache_create(const char *name, unsigned int size,
unsigned int align, slab_flags_t flags,
void (*ctor)(void *))
{
struct kmem_cache_args kmem_args = {
.align = align,
Expand All @@ -418,7 +418,7 @@ kmem_cache_create(const char *name, unsigned int size, unsigned int align,

return __kmem_cache_create_args(name, size, &kmem_args, flags);
}
EXPORT_SYMBOL(kmem_cache_create);
EXPORT_SYMBOL(__kmem_cache_create);

/**
* kmem_cache_create_rcu - Create a SLAB_TYPESAFE_BY_RCU cache.
Expand Down

0 comments on commit b2e7456

Please sign in to comment.