Commit 34410a90 authored by Christian Brauner's avatar Christian Brauner Committed by Vlastimil Babka

slab: pass struct kmem_cache_args to create_cache()

Pass struct kmem_cache_args to create_cache() so that we can later
simplify further helpers.
Reviewed-by: default avatarKees Cook <kees@kernel.org>
Reviewed-by: default avatarJens Axboe <axboe@kernel.dk>
Reviewed-by: default avatarMike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: default avatarVlastimil Babka <vbabka@suse.cz>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
Reviewed-by: default avatarRoman Gushchin <roman.gushchin@linux.dev>
Signed-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
parent 1d3d7645
...@@ -202,22 +202,22 @@ struct kmem_cache *find_mergeable(unsigned int size, unsigned int align, ...@@ -202,22 +202,22 @@ struct kmem_cache *find_mergeable(unsigned int size, unsigned int align,
} }
static struct kmem_cache *create_cache(const char *name, static struct kmem_cache *create_cache(const char *name,
unsigned int object_size, unsigned int freeptr_offset, unsigned int object_size,
unsigned int align, slab_flags_t flags, struct kmem_cache_args *args,
unsigned int useroffset, unsigned int usersize, slab_flags_t flags)
void (*ctor)(void *))
{ {
struct kmem_cache *s; struct kmem_cache *s;
int err; int err;
if (WARN_ON(useroffset + usersize > object_size)) if (WARN_ON(args->useroffset + args->usersize > object_size))
useroffset = usersize = 0; args->useroffset = args->usersize = 0;
/* If a custom freelist pointer is requested make sure it's sane. */ /* If a custom freelist pointer is requested make sure it's sane. */
err = -EINVAL; err = -EINVAL;
if (freeptr_offset != UINT_MAX && if (args->use_freeptr_offset &&
(freeptr_offset >= object_size || !(flags & SLAB_TYPESAFE_BY_RCU) || (args->freeptr_offset >= object_size ||
!IS_ALIGNED(freeptr_offset, sizeof(freeptr_t)))) !(flags & SLAB_TYPESAFE_BY_RCU) ||
!IS_ALIGNED(args->freeptr_offset, sizeof(freeptr_t))))
goto out; goto out;
err = -ENOMEM; err = -ENOMEM;
...@@ -227,12 +227,15 @@ static struct kmem_cache *create_cache(const char *name, ...@@ -227,12 +227,15 @@ static struct kmem_cache *create_cache(const char *name,
s->name = name; s->name = name;
s->size = s->object_size = object_size; s->size = s->object_size = object_size;
s->rcu_freeptr_offset = freeptr_offset; if (args->use_freeptr_offset)
s->align = align; s->rcu_freeptr_offset = args->freeptr_offset;
s->ctor = ctor; else
s->rcu_freeptr_offset = UINT_MAX;
s->align = args->align;
s->ctor = args->ctor;
#ifdef CONFIG_HARDENED_USERCOPY #ifdef CONFIG_HARDENED_USERCOPY
s->useroffset = useroffset; s->useroffset = args->useroffset;
s->usersize = usersize; s->usersize = args->usersize;
#endif #endif
err = do_kmem_cache_create(s, flags); err = do_kmem_cache_create(s, flags);
if (err) if (err)
...@@ -265,7 +268,6 @@ struct kmem_cache *__kmem_cache_create_args(const char *name, ...@@ -265,7 +268,6 @@ struct kmem_cache *__kmem_cache_create_args(const char *name,
slab_flags_t flags) slab_flags_t flags)
{ {
struct kmem_cache *s = NULL; struct kmem_cache *s = NULL;
unsigned int freeptr_offset = UINT_MAX;
const char *cache_name; const char *cache_name;
int err; int err;
...@@ -323,11 +325,8 @@ struct kmem_cache *__kmem_cache_create_args(const char *name, ...@@ -323,11 +325,8 @@ struct kmem_cache *__kmem_cache_create_args(const char *name,
goto out_unlock; goto out_unlock;
} }
if (args->use_freeptr_offset) args->align = calculate_alignment(flags, args->align, object_size);
freeptr_offset = args->freeptr_offset; s = create_cache(cache_name, object_size, args, flags);
s = create_cache(cache_name, object_size, freeptr_offset,
calculate_alignment(flags, args->align, object_size),
flags, args->useroffset, args->usersize, args->ctor);
if (IS_ERR(s)) { if (IS_ERR(s)) {
err = PTR_ERR(s); err = PTR_ERR(s);
kfree_const(cache_name); kfree_const(cache_name);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment