]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
slab: pass struct kmem_cache_args to do_kmem_cache_create()
authorChristian Brauner <brauner@kernel.org>
Thu, 5 Sep 2024 07:56:51 +0000 (09:56 +0200)
committerVlastimil Babka <vbabka@suse.cz>
Tue, 10 Sep 2024 09:42:58 +0000 (11:42 +0200)
and initialize most things in do_kmem_cache_create(). In a follow-up
patch we'll remove rcu_freeptr_offset from struct kmem_cache.

Reviewed-by: Kees Cook <kees@kernel.org>
Reviewed-by: Jens Axboe <axboe@kernel.dk>
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>
Reviewed-by: Roman Gushchin <roman.gushchin@linux.dev>
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
mm/slab.h
mm/slab_common.c
mm/slub.c

index 684bb48c4f399f92d2a90b3491c6c8e9601aacb6..c7a4e0fc3cf1c8079e120366e7202494c2f570c9 100644 (file)
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -424,7 +424,9 @@ kmalloc_slab(size_t size, kmem_buckets *b, gfp_t flags, unsigned long caller)
 gfp_t kmalloc_fix_flags(gfp_t flags);
 
 /* Functions provided by the slab allocators */
-int do_kmem_cache_create(struct kmem_cache *, slab_flags_t flags);
+int do_kmem_cache_create(struct kmem_cache *s, const char *name,
+                        unsigned int size, struct kmem_cache_args *args,
+                        slab_flags_t flags);
 
 void __init kmem_cache_init(void);
 extern void create_boot_cache(struct kmem_cache *, const char *name,
index 9baa61c9c67004f01c1b91520beb36b9869e5866..19ae3dd6e36ff8ca338ffe5e903fad3304c1487b 100644 (file)
@@ -224,20 +224,7 @@ static struct kmem_cache *create_cache(const char *name,
        s = kmem_cache_zalloc(kmem_cache, GFP_KERNEL);
        if (!s)
                goto out;
-
-       s->name = name;
-       s->size = s->object_size = object_size;
-       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 = args->useroffset;
-       s->usersize = args->usersize;
-#endif
-       err = do_kmem_cache_create(s, flags);
+       err = do_kmem_cache_create(s, name, object_size, args, flags);
        if (err)
                goto out_free_cache;
 
@@ -788,9 +775,7 @@ void __init create_boot_cache(struct kmem_cache *s, const char *name,
 {
        int err;
        unsigned int align = ARCH_KMALLOC_MINALIGN;
-
-       s->name = name;
-       s->size = s->object_size = size;
+       struct kmem_cache_args kmem_args = {};
 
        /*
         * kmalloc caches guarantee alignment of at least the largest
@@ -799,14 +784,14 @@ void __init create_boot_cache(struct kmem_cache *s, const char *name,
         */
        if (flags & SLAB_KMALLOC)
                align = max(align, 1U << (ffs(size) - 1));
-       s->align = calculate_alignment(flags, align, size);
+       kmem_args.align = calculate_alignment(flags, align, size);
 
 #ifdef CONFIG_HARDENED_USERCOPY
-       s->useroffset = useroffset;
-       s->usersize = usersize;
+       kmem_args.useroffset = useroffset;
+       kmem_args.usersize = usersize;
 #endif
 
-       err = do_kmem_cache_create(s, flags);
+       err = do_kmem_cache_create(s, name, size, &kmem_args, flags);
 
        if (err)
                panic("Creation of kmalloc slab %s size=%u failed. Reason %d\n",
index 30f4ca6335c7fb813214085783033155eb51ac52..4719b60215b8ed2393415e176c69cba1726cd601 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -5843,14 +5843,29 @@ __kmem_cache_alias(const char *name, unsigned int size, unsigned int align,
        return s;
 }
 
-int do_kmem_cache_create(struct kmem_cache *s, slab_flags_t flags)
+int do_kmem_cache_create(struct kmem_cache *s, const char *name,
+                        unsigned int size, struct kmem_cache_args *args,
+                        slab_flags_t flags)
 {
        int err = -EINVAL;
 
+       s->name = name;
+       s->size = s->object_size = size;
+
        s->flags = kmem_cache_flags(flags, s->name);
 #ifdef CONFIG_SLAB_FREELIST_HARDENED
        s->random = get_random_long();
 #endif
+       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 = args->useroffset;
+       s->usersize = args->usersize;
+#endif
 
        if (!calculate_sizes(s))
                goto out;