Message ID | 20240903-work-kmem_cache_args-v2-6-76f97e9a4560@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | slab: add struct kmem_cache_args | expand |
On Tue, Sep 03, 2024 at 04:20:47PM +0200, Christian Brauner wrote: > Pass struct kmem_cache_args to create_cache() so that we can later > simplify further helpers. > > Signed-off-by: Christian Brauner <brauner@kernel.org> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org> > --- > mm/slab_common.c | 39 +++++++++++++++++++-------------------- > 1 file changed, 19 insertions(+), 20 deletions(-) > > diff --git a/mm/slab_common.c b/mm/slab_common.c > index 16c36a946135..9baa61c9c670 100644 > --- a/mm/slab_common.c > +++ b/mm/slab_common.c > @@ -202,22 +202,22 @@ struct kmem_cache *find_mergeable(unsigned int size, unsigned int align, > } > > static struct kmem_cache *create_cache(const char *name, > - unsigned int object_size, unsigned int freeptr_offset, > - unsigned int align, slab_flags_t flags, > - unsigned int useroffset, unsigned int usersize, > - void (*ctor)(void *)) > + unsigned int object_size, > + struct kmem_cache_args *args, > + slab_flags_t flags) > { > struct kmem_cache *s; > int err; > > - if (WARN_ON(useroffset + usersize > object_size)) > - useroffset = usersize = 0; > + if (WARN_ON(args->useroffset + args->usersize > object_size)) > + args->useroffset = args->usersize = 0; > > /* If a custom freelist pointer is requested make sure it's sane. */ > err = -EINVAL; > - if (freeptr_offset != UINT_MAX && > - (freeptr_offset >= object_size || !(flags & SLAB_TYPESAFE_BY_RCU) || > - !IS_ALIGNED(freeptr_offset, sizeof(freeptr_t)))) > + if (args->use_freeptr_offset && > + (args->freeptr_offset >= object_size || > + !(flags & SLAB_TYPESAFE_BY_RCU) || > + !IS_ALIGNED(args->freeptr_offset, sizeof(freeptr_t)))) > goto out; > > err = -ENOMEM; > @@ -227,12 +227,15 @@ static struct kmem_cache *create_cache(const char *name, > > s->name = name; > s->size = s->object_size = object_size; > - s->rcu_freeptr_offset = freeptr_offset; > - s->align = align; > - s->ctor = ctor; > + if (args->use_freeptr_offset) > + s->rcu_freeptr_offset = args->freeptr_offset; > + else > + s->rcu_freeptr_offset = UINT_MAX; > + s->align = args->align; > + s->ctor = args->ctor; > #ifdef CONFIG_HARDENED_USERCOPY > - s->useroffset = useroffset; > - s->usersize = usersize; > + s->useroffset = args->useroffset; > + s->usersize = args->usersize; > #endif > err = do_kmem_cache_create(s, flags); > if (err) > @@ -265,7 +268,6 @@ struct kmem_cache *__kmem_cache_create_args(const char *name, > slab_flags_t flags) > { > struct kmem_cache *s = NULL; > - unsigned int freeptr_offset = UINT_MAX; > const char *cache_name; > int err; > > @@ -323,11 +325,8 @@ struct kmem_cache *__kmem_cache_create_args(const char *name, > goto out_unlock; > } > > - if (args->use_freeptr_offset) > - freeptr_offset = args->freeptr_offset; > - s = create_cache(cache_name, object_size, freeptr_offset, > - calculate_alignment(flags, args->align, object_size), > - flags, args->useroffset, args->usersize, args->ctor); > + args->align = calculate_alignment(flags, args->align, object_size); > + s = create_cache(cache_name, object_size, args, flags); > if (IS_ERR(s)) { > err = PTR_ERR(s); > kfree_const(cache_name); > > -- > 2.45.2 >
diff --git a/mm/slab_common.c b/mm/slab_common.c index 16c36a946135..9baa61c9c670 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c @@ -202,22 +202,22 @@ struct kmem_cache *find_mergeable(unsigned int size, unsigned int align, } static struct kmem_cache *create_cache(const char *name, - unsigned int object_size, unsigned int freeptr_offset, - unsigned int align, slab_flags_t flags, - unsigned int useroffset, unsigned int usersize, - void (*ctor)(void *)) + unsigned int object_size, + struct kmem_cache_args *args, + slab_flags_t flags) { struct kmem_cache *s; int err; - if (WARN_ON(useroffset + usersize > object_size)) - useroffset = usersize = 0; + if (WARN_ON(args->useroffset + args->usersize > object_size)) + args->useroffset = args->usersize = 0; /* If a custom freelist pointer is requested make sure it's sane. */ err = -EINVAL; - if (freeptr_offset != UINT_MAX && - (freeptr_offset >= object_size || !(flags & SLAB_TYPESAFE_BY_RCU) || - !IS_ALIGNED(freeptr_offset, sizeof(freeptr_t)))) + if (args->use_freeptr_offset && + (args->freeptr_offset >= object_size || + !(flags & SLAB_TYPESAFE_BY_RCU) || + !IS_ALIGNED(args->freeptr_offset, sizeof(freeptr_t)))) goto out; err = -ENOMEM; @@ -227,12 +227,15 @@ static struct kmem_cache *create_cache(const char *name, s->name = name; s->size = s->object_size = object_size; - s->rcu_freeptr_offset = freeptr_offset; - s->align = align; - s->ctor = ctor; + if (args->use_freeptr_offset) + s->rcu_freeptr_offset = args->freeptr_offset; + else + s->rcu_freeptr_offset = UINT_MAX; + s->align = args->align; + s->ctor = args->ctor; #ifdef CONFIG_HARDENED_USERCOPY - s->useroffset = useroffset; - s->usersize = usersize; + s->useroffset = args->useroffset; + s->usersize = args->usersize; #endif err = do_kmem_cache_create(s, flags); if (err) @@ -265,7 +268,6 @@ struct kmem_cache *__kmem_cache_create_args(const char *name, slab_flags_t flags) { struct kmem_cache *s = NULL; - unsigned int freeptr_offset = UINT_MAX; const char *cache_name; int err; @@ -323,11 +325,8 @@ struct kmem_cache *__kmem_cache_create_args(const char *name, goto out_unlock; } - if (args->use_freeptr_offset) - freeptr_offset = args->freeptr_offset; - s = create_cache(cache_name, object_size, freeptr_offset, - calculate_alignment(flags, args->align, object_size), - flags, args->useroffset, args->usersize, args->ctor); + args->align = calculate_alignment(flags, args->align, object_size); + s = create_cache(cache_name, object_size, args, flags); if (IS_ERR(s)) { err = PTR_ERR(s); kfree_const(cache_name);
Pass struct kmem_cache_args to create_cache() so that we can later simplify further helpers. Signed-off-by: Christian Brauner <brauner@kernel.org> --- mm/slab_common.c | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-)