diff mbox series

[v2,08/15] slab: pass struct kmem_cache_args to do_kmem_cache_create()

Message ID 20240903-work-kmem_cache_args-v2-8-76f97e9a4560@kernel.org (mailing list archive)
State New
Headers show
Series slab: add struct kmem_cache_args | expand

Commit Message

Christian Brauner Sept. 3, 2024, 2:20 p.m. UTC
and initialize most things in do_kmem_cache_create(). In a follow-up
patch we'll remove rcu_freeptr_offset from struct kmem_cache.

Signed-off-by: Christian Brauner <brauner@kernel.org>
---
 mm/slab.h        |  4 +++-
 mm/slab_common.c | 27 ++++++---------------------
 mm/slub.c        | 17 ++++++++++++++++-
 3 files changed, 25 insertions(+), 23 deletions(-)

Comments

Mike Rapoport Sept. 4, 2024, 5:04 a.m. UTC | #1
On Tue, Sep 03, 2024 at 04:20:49PM +0200, Christian Brauner wrote:
> and initialize most things in do_kmem_cache_create(). In a follow-up
> patch we'll remove rcu_freeptr_offset from struct kmem_cache.
> 
> Signed-off-by: Christian Brauner <brauner@kernel.org>

Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>

> ---
>  mm/slab.h        |  4 +++-
>  mm/slab_common.c | 27 ++++++---------------------
>  mm/slub.c        | 17 ++++++++++++++++-
>  3 files changed, 25 insertions(+), 23 deletions(-)
> 
> diff --git a/mm/slab.h b/mm/slab.h
> index 684bb48c4f39..c7a4e0fc3cf1 100644
> --- 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,
> diff --git a/mm/slab_common.c b/mm/slab_common.c
> index 9baa61c9c670..19ae3dd6e36f 100644
> --- a/mm/slab_common.c
> +++ b/mm/slab_common.c
> @@ -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",
> diff --git a/mm/slub.c b/mm/slub.c
> index 30f4ca6335c7..4719b60215b8 100644
> --- 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;
> 
> -- 
> 2.45.2
>
diff mbox series

Patch

diff --git a/mm/slab.h b/mm/slab.h
index 684bb48c4f39..c7a4e0fc3cf1 100644
--- 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,
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 9baa61c9c670..19ae3dd6e36f 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -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",
diff --git a/mm/slub.c b/mm/slub.c
index 30f4ca6335c7..4719b60215b8 100644
--- 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;