mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-04 04:06:26 +00:00
slab: create kmem_cache_create() compatibility layer
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>
This commit is contained in:
parent
199cd13a74
commit
b2e7456b5c
@ -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,
|
||||
@ -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);
|
||||
|
||||
|
@ -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.
|
||||
@ -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,
|
||||
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user