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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>

Reviewed-by: Mike Rapoport (Microsoft) <rppt@xxxxxxxxxx>

> ---
>  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
> 

-- 
Sincerely yours,
Mike.




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux