diff mbox series

[v2,12/15] slab: create kmem_cache_create() compatibility layer

Message ID 20240903-work-kmem_cache_args-v2-12-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
Use _Generic() to create a compatibility layer that type switches on the
third argument to either call __kmem_cache_create() or
__kmem_cache_create_args(). This can be kept in place until all callers
have been ported to struct kmem_cache_args.

Signed-off-by: Christian Brauner <brauner@kernel.org>
---
 include/linux/slab.h | 13 ++++++++++---
 mm/slab_common.c     | 10 +++++-----
 2 files changed, 15 insertions(+), 8 deletions(-)

Comments

Mike Rapoport Sept. 4, 2024, 5:14 a.m. UTC | #1
On Tue, Sep 03, 2024 at 04:20:53PM +0200, Christian Brauner wrote:
> Use _Generic() to create a compatibility layer that type switches on the
> third argument to either call __kmem_cache_create() or
> __kmem_cache_create_args(). This can be kept in place until all callers
> have been ported to struct kmem_cache_args.
> 
> Signed-off-by: Christian Brauner <brauner@kernel.org>

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

> ---
>  include/linux/slab.h | 13 ++++++++++---
>  mm/slab_common.c     | 10 +++++-----
>  2 files changed, 15 insertions(+), 8 deletions(-)
> 
> diff --git a/include/linux/slab.h b/include/linux/slab.h
> index aced16a08700..4292d67094c3 100644
> --- a/include/linux/slab.h
> +++ b/include/linux/slab.h
> @@ -261,9 +261,10 @@ struct kmem_cache *__kmem_cache_create_args(const char *name,
>  					    unsigned int object_size,
>  					    struct kmem_cache_args *args,
>  					    slab_flags_t flags);
> -struct kmem_cache *kmem_cache_create(const char *name, unsigned int size,
> -			unsigned int align, slab_flags_t flags,
> -			void (*ctor)(void *));
> +
> +struct kmem_cache *__kmem_cache_create(const char *name, unsigned int size,
> +				       unsigned int align, slab_flags_t flags,
> +				       void (*ctor)(void *));

As I said earlier, this can become _kmem_cache_create and
__kmem_cache_create_args can be __kmem_cache_create from the beginning.

And as a followup cleanup both kmem_cache_create_usercopy() and
kmem_cache_create() can be made static inlines.

>  struct kmem_cache *kmem_cache_create_usercopy(const char *name,
>  			unsigned int size, unsigned int align,
>  			slab_flags_t flags,
> @@ -272,6 +273,12 @@ struct kmem_cache *kmem_cache_create_usercopy(const char *name,
>  struct kmem_cache *kmem_cache_create_rcu(const char *name, unsigned int size,
>  					 unsigned int freeptr_offset,
>  					 slab_flags_t flags);
> +
> +#define kmem_cache_create(__name, __object_size, __args, ...)           \
> +	_Generic((__args),                                              \
> +		struct kmem_cache_args *: __kmem_cache_create_args,	\
> +		default: __kmem_cache_create)(__name, __object_size, __args, __VA_ARGS__)
> +
>  void kmem_cache_destroy(struct kmem_cache *s);
>  int kmem_cache_shrink(struct kmem_cache *s);
>  
> diff --git a/mm/slab_common.c b/mm/slab_common.c
> index 19ae3dd6e36f..418459927670 100644
> --- a/mm/slab_common.c
> +++ b/mm/slab_common.c
> @@ -383,7 +383,7 @@ kmem_cache_create_usercopy(const char *name, unsigned int size,
>  EXPORT_SYMBOL(kmem_cache_create_usercopy);
>  
>  /**
> - * kmem_cache_create - Create a cache.
> + * __kmem_cache_create - Create a cache.
>   * @name: A string which is used in /proc/slabinfo to identify this cache.
>   * @size: The size of objects to be created in this cache.
>   * @align: The required alignment for the objects.
> @@ -407,9 +407,9 @@ EXPORT_SYMBOL(kmem_cache_create_usercopy);
>   *
>   * Return: a pointer to the cache on success, NULL on failure.
>   */
> -struct kmem_cache *
> -kmem_cache_create(const char *name, unsigned int size, unsigned int align,
> -		slab_flags_t flags, void (*ctor)(void *))
> +struct kmem_cache *__kmem_cache_create(const char *name, unsigned int size,
> +				       unsigned int align, slab_flags_t flags,
> +				       void (*ctor)(void *))
>  {
>  	struct kmem_cache_args kmem_args = {
>  		.align	= align,
> @@ -418,7 +418,7 @@ kmem_cache_create(const char *name, unsigned int size, unsigned int align,
>  
>  	return __kmem_cache_create_args(name, size, &kmem_args, flags);
>  }
> -EXPORT_SYMBOL(kmem_cache_create);
> +EXPORT_SYMBOL(__kmem_cache_create);
>  
>  /**
>   * kmem_cache_create_rcu - Create a SLAB_TYPESAFE_BY_RCU cache.
> 
> -- 
> 2.45.2
>
Christian Brauner Sept. 4, 2024, 9:45 a.m. UTC | #2
On Wed, Sep 04, 2024 at 08:14:24AM GMT, Mike Rapoport wrote:
> On Tue, Sep 03, 2024 at 04:20:53PM +0200, Christian Brauner wrote:
> > Use _Generic() to create a compatibility layer that type switches on the
> > third argument to either call __kmem_cache_create() or
> > __kmem_cache_create_args(). This can be kept in place until all callers
> > have been ported to struct kmem_cache_args.
> > 
> > Signed-off-by: Christian Brauner <brauner@kernel.org>
> 
> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> 
> > ---
> >  include/linux/slab.h | 13 ++++++++++---
> >  mm/slab_common.c     | 10 +++++-----
> >  2 files changed, 15 insertions(+), 8 deletions(-)
> > 
> > diff --git a/include/linux/slab.h b/include/linux/slab.h
> > index aced16a08700..4292d67094c3 100644
> > --- a/include/linux/slab.h
> > +++ b/include/linux/slab.h
> > @@ -261,9 +261,10 @@ struct kmem_cache *__kmem_cache_create_args(const char *name,
> >  					    unsigned int object_size,
> >  					    struct kmem_cache_args *args,
> >  					    slab_flags_t flags);
> > -struct kmem_cache *kmem_cache_create(const char *name, unsigned int size,
> > -			unsigned int align, slab_flags_t flags,
> > -			void (*ctor)(void *));
> > +
> > +struct kmem_cache *__kmem_cache_create(const char *name, unsigned int size,
> > +				       unsigned int align, slab_flags_t flags,
> > +				       void (*ctor)(void *));
> 
> As I said earlier, this can become _kmem_cache_create and
> __kmem_cache_create_args can be __kmem_cache_create from the beginning.
> 
> And as a followup cleanup both kmem_cache_create_usercopy() and
> kmem_cache_create() can be made static inlines.

Seems an ok suggestion to me. See the two patches I sent out now.
Vlastimil Babka Sept. 4, 2024, 10:50 a.m. UTC | #3
On 9/4/24 11:45, Christian Brauner wrote:
> On Wed, Sep 04, 2024 at 08:14:24AM GMT, Mike Rapoport wrote:
>> On Tue, Sep 03, 2024 at 04:20:53PM +0200, Christian Brauner wrote:
>> > Use _Generic() to create a compatibility layer that type switches on the
>> > third argument to either call __kmem_cache_create() or
>> > __kmem_cache_create_args(). This can be kept in place until all callers
>> > have been ported to struct kmem_cache_args.
>> > 
>> > Signed-off-by: Christian Brauner <brauner@kernel.org>
>> 
>> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
>> 
>> > ---
>> >  include/linux/slab.h | 13 ++++++++++---
>> >  mm/slab_common.c     | 10 +++++-----
>> >  2 files changed, 15 insertions(+), 8 deletions(-)
>> > 
>> > diff --git a/include/linux/slab.h b/include/linux/slab.h
>> > index aced16a08700..4292d67094c3 100644
>> > --- a/include/linux/slab.h
>> > +++ b/include/linux/slab.h
>> > @@ -261,9 +261,10 @@ struct kmem_cache *__kmem_cache_create_args(const char *name,
>> >  					    unsigned int object_size,
>> >  					    struct kmem_cache_args *args,
>> >  					    slab_flags_t flags);
>> > -struct kmem_cache *kmem_cache_create(const char *name, unsigned int size,
>> > -			unsigned int align, slab_flags_t flags,
>> > -			void (*ctor)(void *));
>> > +
>> > +struct kmem_cache *__kmem_cache_create(const char *name, unsigned int size,
>> > +				       unsigned int align, slab_flags_t flags,
>> > +				       void (*ctor)(void *));
>> 
>> As I said earlier, this can become _kmem_cache_create and
>> __kmem_cache_create_args can be __kmem_cache_create from the beginning.

I didn't notice an answer to this suggestion? Even if it's just that you
don't think it's worth the rewrite, or it's not possible because X Y Z.
Thanks.

>> And as a followup cleanup both kmem_cache_create_usercopy() and
>> kmem_cache_create() can be made static inlines.
> 
> Seems an ok suggestion to me. See the two patches I sent out now.
Christian Brauner Sept. 4, 2024, 11:38 a.m. UTC | #4
On Wed, Sep 04, 2024 at 12:50:28PM GMT, Vlastimil Babka wrote:
> On 9/4/24 11:45, Christian Brauner wrote:
> > On Wed, Sep 04, 2024 at 08:14:24AM GMT, Mike Rapoport wrote:
> >> On Tue, Sep 03, 2024 at 04:20:53PM +0200, Christian Brauner wrote:
> >> > Use _Generic() to create a compatibility layer that type switches on the
> >> > third argument to either call __kmem_cache_create() or
> >> > __kmem_cache_create_args(). This can be kept in place until all callers
> >> > have been ported to struct kmem_cache_args.
> >> > 
> >> > Signed-off-by: Christian Brauner <brauner@kernel.org>
> >> 
> >> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> >> 
> >> > ---
> >> >  include/linux/slab.h | 13 ++++++++++---
> >> >  mm/slab_common.c     | 10 +++++-----
> >> >  2 files changed, 15 insertions(+), 8 deletions(-)
> >> > 
> >> > diff --git a/include/linux/slab.h b/include/linux/slab.h
> >> > index aced16a08700..4292d67094c3 100644
> >> > --- a/include/linux/slab.h
> >> > +++ b/include/linux/slab.h
> >> > @@ -261,9 +261,10 @@ struct kmem_cache *__kmem_cache_create_args(const char *name,
> >> >  					    unsigned int object_size,
> >> >  					    struct kmem_cache_args *args,
> >> >  					    slab_flags_t flags);
> >> > -struct kmem_cache *kmem_cache_create(const char *name, unsigned int size,
> >> > -			unsigned int align, slab_flags_t flags,
> >> > -			void (*ctor)(void *));
> >> > +
> >> > +struct kmem_cache *__kmem_cache_create(const char *name, unsigned int size,
> >> > +				       unsigned int align, slab_flags_t flags,
> >> > +				       void (*ctor)(void *));
> >> 
> >> As I said earlier, this can become _kmem_cache_create and
> >> __kmem_cache_create_args can be __kmem_cache_create from the beginning.
> 
> I didn't notice an answer to this suggestion? Even if it's just that you
> don't think it's worth the rewrite, or it's not possible because X Y Z.
> Thanks.

I'm confused. I sent two patches as a reply to the thread plus the
answer below and there's two patches in v3 that you can use or drop.

> 
> >> And as a followup cleanup both kmem_cache_create_usercopy() and
> >> kmem_cache_create() can be made static inlines.
> > 
> > Seems an ok suggestion to me. See the two patches I sent out now.
>
Vlastimil Babka Sept. 4, 2024, 1:33 p.m. UTC | #5
On 9/4/24 13:38, Christian Brauner wrote:
> On Wed, Sep 04, 2024 at 12:50:28PM GMT, Vlastimil Babka wrote:
>> On 9/4/24 11:45, Christian Brauner wrote:
>> > On Wed, Sep 04, 2024 at 08:14:24AM GMT, Mike Rapoport wrote:
>> >> On Tue, Sep 03, 2024 at 04:20:53PM +0200, Christian Brauner wrote:
>> >> > Use _Generic() to create a compatibility layer that type switches on the
>> >> > third argument to either call __kmem_cache_create() or
>> >> > __kmem_cache_create_args(). This can be kept in place until all callers
>> >> > have been ported to struct kmem_cache_args.
>> >> > 
>> >> > Signed-off-by: Christian Brauner <brauner@kernel.org>
>> >> 
>> >> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
>> >> 
>> >> > ---
>> >> >  include/linux/slab.h | 13 ++++++++++---
>> >> >  mm/slab_common.c     | 10 +++++-----
>> >> >  2 files changed, 15 insertions(+), 8 deletions(-)
>> >> > 
>> >> > diff --git a/include/linux/slab.h b/include/linux/slab.h
>> >> > index aced16a08700..4292d67094c3 100644
>> >> > --- a/include/linux/slab.h
>> >> > +++ b/include/linux/slab.h
>> >> > @@ -261,9 +261,10 @@ struct kmem_cache *__kmem_cache_create_args(const char *name,
>> >> >  					    unsigned int object_size,
>> >> >  					    struct kmem_cache_args *args,
>> >> >  					    slab_flags_t flags);
>> >> > -struct kmem_cache *kmem_cache_create(const char *name, unsigned int size,
>> >> > -			unsigned int align, slab_flags_t flags,
>> >> > -			void (*ctor)(void *));
>> >> > +
>> >> > +struct kmem_cache *__kmem_cache_create(const char *name, unsigned int size,
>> >> > +				       unsigned int align, slab_flags_t flags,
>> >> > +				       void (*ctor)(void *));
>> >> 
>> >> As I said earlier, this can become _kmem_cache_create and
>> >> __kmem_cache_create_args can be __kmem_cache_create from the beginning.
>> 
>> I didn't notice an answer to this suggestion? Even if it's just that you
>> don't think it's worth the rewrite, or it's not possible because X Y Z.
>> Thanks.
> 
> I'm confused. I sent two patches as a reply to the thread plus the
> answer below and there's two patches in v3 that you can use or drop.

Right, that's the part below. But the suggestion above, and also in Mike's
reply to 02/12 was AFAICS to rename __kmem_cache_create_args to
__kmem_cache_create (since patch 02) and here __kmem_cache_create to
_kmem_cache_create. It just seemed odd to see no reaction to that (did I
miss or not receive it?).

>> 
>> >> And as a followup cleanup both kmem_cache_create_usercopy() and
>> >> kmem_cache_create() can be made static inlines.
>> > 
>> > Seems an ok suggestion to me. See the two patches I sent out now.
>>
Christian Brauner Sept. 4, 2024, 2:44 p.m. UTC | #6
On Wed, Sep 04, 2024 at 03:33:30PM GMT, Vlastimil Babka wrote:
> On 9/4/24 13:38, Christian Brauner wrote:
> > On Wed, Sep 04, 2024 at 12:50:28PM GMT, Vlastimil Babka wrote:
> >> On 9/4/24 11:45, Christian Brauner wrote:
> >> > On Wed, Sep 04, 2024 at 08:14:24AM GMT, Mike Rapoport wrote:
> >> >> On Tue, Sep 03, 2024 at 04:20:53PM +0200, Christian Brauner wrote:
> >> >> > Use _Generic() to create a compatibility layer that type switches on the
> >> >> > third argument to either call __kmem_cache_create() or
> >> >> > __kmem_cache_create_args(). This can be kept in place until all callers
> >> >> > have been ported to struct kmem_cache_args.
> >> >> > 
> >> >> > Signed-off-by: Christian Brauner <brauner@kernel.org>
> >> >> 
> >> >> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> >> >> 
> >> >> > ---
> >> >> >  include/linux/slab.h | 13 ++++++++++---
> >> >> >  mm/slab_common.c     | 10 +++++-----
> >> >> >  2 files changed, 15 insertions(+), 8 deletions(-)
> >> >> > 
> >> >> > diff --git a/include/linux/slab.h b/include/linux/slab.h
> >> >> > index aced16a08700..4292d67094c3 100644
> >> >> > --- a/include/linux/slab.h
> >> >> > +++ b/include/linux/slab.h
> >> >> > @@ -261,9 +261,10 @@ struct kmem_cache *__kmem_cache_create_args(const char *name,
> >> >> >  					    unsigned int object_size,
> >> >> >  					    struct kmem_cache_args *args,
> >> >> >  					    slab_flags_t flags);
> >> >> > -struct kmem_cache *kmem_cache_create(const char *name, unsigned int size,
> >> >> > -			unsigned int align, slab_flags_t flags,
> >> >> > -			void (*ctor)(void *));
> >> >> > +
> >> >> > +struct kmem_cache *__kmem_cache_create(const char *name, unsigned int size,
> >> >> > +				       unsigned int align, slab_flags_t flags,
> >> >> > +				       void (*ctor)(void *));
> >> >> 
> >> >> As I said earlier, this can become _kmem_cache_create and
> >> >> __kmem_cache_create_args can be __kmem_cache_create from the beginning.
> >> 
> >> I didn't notice an answer to this suggestion? Even if it's just that you
> >> don't think it's worth the rewrite, or it's not possible because X Y Z.
> >> Thanks.
> > 
> > I'm confused. I sent two patches as a reply to the thread plus the
> > answer below and there's two patches in v3 that you can use or drop.
> 
> Right, that's the part below. But the suggestion above, and also in Mike's
> reply to 02/12 was AFAICS to rename __kmem_cache_create_args to
> __kmem_cache_create (since patch 02) and here __kmem_cache_create to
> _kmem_cache_create. It just seemed odd to see no reaction to that (did I
> miss or not receive it?).

Oh, I see. I read it as a expressing taste and so I didn't bother
replying. And I really dislike single underscore function names so I
would like to avoid it and it also seems more confusing to me.
Mike Rapoport Sept. 4, 2024, 3:11 p.m. UTC | #7
On Wed, Sep 04, 2024 at 04:44:03PM +0200, Christian Brauner wrote:
> On Wed, Sep 04, 2024 at 03:33:30PM GMT, Vlastimil Babka wrote:
> > On 9/4/24 13:38, Christian Brauner wrote:
> > > On Wed, Sep 04, 2024 at 12:50:28PM GMT, Vlastimil Babka wrote:
> > >> On 9/4/24 11:45, Christian Brauner wrote:
> > >> > On Wed, Sep 04, 2024 at 08:14:24AM GMT, Mike Rapoport wrote:
> > >> >> On Tue, Sep 03, 2024 at 04:20:53PM +0200, Christian Brauner wrote:
> > >> >> > Use _Generic() to create a compatibility layer that type switches on the
> > >> >> > third argument to either call __kmem_cache_create() or
> > >> >> > __kmem_cache_create_args(). This can be kept in place until all callers
> > >> >> > have been ported to struct kmem_cache_args.
> > >> >> > 
> > >> >> > Signed-off-by: Christian Brauner <brauner@kernel.org>
> > >> >> 
> > >> >> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> > >> >> 
> > >> >> > ---
> > >> >> >  include/linux/slab.h | 13 ++++++++++---
> > >> >> >  mm/slab_common.c     | 10 +++++-----
> > >> >> >  2 files changed, 15 insertions(+), 8 deletions(-)
> > >> >> > 
> > >> >> > diff --git a/include/linux/slab.h b/include/linux/slab.h
> > >> >> > index aced16a08700..4292d67094c3 100644
> > >> >> > --- a/include/linux/slab.h
> > >> >> > +++ b/include/linux/slab.h
> > >> >> > @@ -261,9 +261,10 @@ struct kmem_cache *__kmem_cache_create_args(const char *name,
> > >> >> >  					    unsigned int object_size,
> > >> >> >  					    struct kmem_cache_args *args,
> > >> >> >  					    slab_flags_t flags);
> > >> >> > -struct kmem_cache *kmem_cache_create(const char *name, unsigned int size,
> > >> >> > -			unsigned int align, slab_flags_t flags,
> > >> >> > -			void (*ctor)(void *));
> > >> >> > +
> > >> >> > +struct kmem_cache *__kmem_cache_create(const char *name, unsigned int size,
> > >> >> > +				       unsigned int align, slab_flags_t flags,
> > >> >> > +				       void (*ctor)(void *));
> > >> >> 
> > >> >> As I said earlier, this can become _kmem_cache_create and
> > >> >> __kmem_cache_create_args can be __kmem_cache_create from the beginning.
> > >> 
> > >> I didn't notice an answer to this suggestion? Even if it's just that you
> > >> don't think it's worth the rewrite, or it's not possible because X Y Z.
> > >> Thanks.
> > > 
> > > I'm confused. I sent two patches as a reply to the thread plus the
> > > answer below and there's two patches in v3 that you can use or drop.
> > 
> > Right, that's the part below. But the suggestion above, and also in Mike's
> > reply to 02/12 was AFAICS to rename __kmem_cache_create_args to
> > __kmem_cache_create (since patch 02) and here __kmem_cache_create to
> > _kmem_cache_create. It just seemed odd to see no reaction to that (did I
> > miss or not receive it?).
> 
> Oh, I see. I read it as a expressing taste and so I didn't bother
> replying. And I really dislike single underscore function names so I
> would like to avoid it and it also seems more confusing to me.

Heh, not quite. I don't like kmem_cache_create_args essentially becoming a
replacement for kmem_cache_create* and I'd prefer __kmem_cache_create
naming.

As for the single underscore, I don't have strong feelings about it, but I
do think that it should be renamed to something else than
__kmem_cache_create to leave __kmem_cache_create for the core function.
Christian Brauner Sept. 4, 2024, 3:38 p.m. UTC | #8
On Wed, Sep 04, 2024 at 06:11:10PM GMT, Mike Rapoport wrote:
> On Wed, Sep 04, 2024 at 04:44:03PM +0200, Christian Brauner wrote:
> > On Wed, Sep 04, 2024 at 03:33:30PM GMT, Vlastimil Babka wrote:
> > > On 9/4/24 13:38, Christian Brauner wrote:
> > > > On Wed, Sep 04, 2024 at 12:50:28PM GMT, Vlastimil Babka wrote:
> > > >> On 9/4/24 11:45, Christian Brauner wrote:
> > > >> > On Wed, Sep 04, 2024 at 08:14:24AM GMT, Mike Rapoport wrote:
> > > >> >> On Tue, Sep 03, 2024 at 04:20:53PM +0200, Christian Brauner wrote:
> > > >> >> > Use _Generic() to create a compatibility layer that type switches on the
> > > >> >> > third argument to either call __kmem_cache_create() or
> > > >> >> > __kmem_cache_create_args(). This can be kept in place until all callers
> > > >> >> > have been ported to struct kmem_cache_args.
> > > >> >> > 
> > > >> >> > Signed-off-by: Christian Brauner <brauner@kernel.org>
> > > >> >> 
> > > >> >> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> > > >> >> 
> > > >> >> > ---
> > > >> >> >  include/linux/slab.h | 13 ++++++++++---
> > > >> >> >  mm/slab_common.c     | 10 +++++-----
> > > >> >> >  2 files changed, 15 insertions(+), 8 deletions(-)
> > > >> >> > 
> > > >> >> > diff --git a/include/linux/slab.h b/include/linux/slab.h
> > > >> >> > index aced16a08700..4292d67094c3 100644
> > > >> >> > --- a/include/linux/slab.h
> > > >> >> > +++ b/include/linux/slab.h
> > > >> >> > @@ -261,9 +261,10 @@ struct kmem_cache *__kmem_cache_create_args(const char *name,
> > > >> >> >  					    unsigned int object_size,
> > > >> >> >  					    struct kmem_cache_args *args,
> > > >> >> >  					    slab_flags_t flags);
> > > >> >> > -struct kmem_cache *kmem_cache_create(const char *name, unsigned int size,
> > > >> >> > -			unsigned int align, slab_flags_t flags,
> > > >> >> > -			void (*ctor)(void *));
> > > >> >> > +
> > > >> >> > +struct kmem_cache *__kmem_cache_create(const char *name, unsigned int size,
> > > >> >> > +				       unsigned int align, slab_flags_t flags,
> > > >> >> > +				       void (*ctor)(void *));
> > > >> >> 
> > > >> >> As I said earlier, this can become _kmem_cache_create and
> > > >> >> __kmem_cache_create_args can be __kmem_cache_create from the beginning.
> > > >> 
> > > >> I didn't notice an answer to this suggestion? Even if it's just that you
> > > >> don't think it's worth the rewrite, or it's not possible because X Y Z.
> > > >> Thanks.
> > > > 
> > > > I'm confused. I sent two patches as a reply to the thread plus the
> > > > answer below and there's two patches in v3 that you can use or drop.
> > > 
> > > Right, that's the part below. But the suggestion above, and also in Mike's
> > > reply to 02/12 was AFAICS to rename __kmem_cache_create_args to
> > > __kmem_cache_create (since patch 02) and here __kmem_cache_create to
> > > _kmem_cache_create. It just seemed odd to see no reaction to that (did I
> > > miss or not receive it?).
> > 
> > Oh, I see. I read it as a expressing taste and so I didn't bother
> > replying. And I really dislike single underscore function names so I
> > would like to avoid it and it also seems more confusing to me.
> 
> Heh, not quite. I don't like kmem_cache_create_args essentially becoming a
> replacement for kmem_cache_create* and I'd prefer __kmem_cache_create
> naming.
> 
> As for the single underscore, I don't have strong feelings about it, but I
> do think that it should be renamed to something else than
> __kmem_cache_create to leave __kmem_cache_create for the core function.

I honestly don't care especially because it's not visible outside of the
header. If you care then a simple patch on top of the series to rename
to whatever is fine by me.

But single vs double underscore with fundamentally different parameters
seems ripe for visual confusion and the compatibility layer will go away
anyway.
Vlastimil Babka Sept. 4, 2024, 3:40 p.m. UTC | #9
On 9/4/24 17:11, Mike Rapoport wrote:
>> 
>> Oh, I see. I read it as a expressing taste and so I didn't bother
>> replying. And I really dislike single underscore function names so I
>> would like to avoid it and it also seems more confusing to me.
> 
> Heh, not quite. I don't like kmem_cache_create_args essentially becoming a
> replacement for kmem_cache_create* and I'd prefer __kmem_cache_create
> naming.

It's __kmem_cache_create_args(). If it didn't have the underscores, I'd
agree it might be misleading into being used directly. But like this it
doesn't bother me much.

> As for the single underscore, I don't have strong feelings about it, but I
> do think that it should be renamed to something else than
> __kmem_cache_create to leave __kmem_cache_create for the core function.
diff mbox series

Patch

diff --git a/include/linux/slab.h b/include/linux/slab.h
index aced16a08700..4292d67094c3 100644
--- a/include/linux/slab.h
+++ b/include/linux/slab.h
@@ -261,9 +261,10 @@  struct kmem_cache *__kmem_cache_create_args(const char *name,
 					    unsigned int object_size,
 					    struct kmem_cache_args *args,
 					    slab_flags_t flags);
-struct kmem_cache *kmem_cache_create(const char *name, unsigned int size,
-			unsigned int align, slab_flags_t flags,
-			void (*ctor)(void *));
+
+struct kmem_cache *__kmem_cache_create(const char *name, unsigned int size,
+				       unsigned int align, slab_flags_t flags,
+				       void (*ctor)(void *));
 struct kmem_cache *kmem_cache_create_usercopy(const char *name,
 			unsigned int size, unsigned int align,
 			slab_flags_t flags,
@@ -272,6 +273,12 @@  struct kmem_cache *kmem_cache_create_usercopy(const char *name,
 struct kmem_cache *kmem_cache_create_rcu(const char *name, unsigned int size,
 					 unsigned int freeptr_offset,
 					 slab_flags_t flags);
+
+#define kmem_cache_create(__name, __object_size, __args, ...)           \
+	_Generic((__args),                                              \
+		struct kmem_cache_args *: __kmem_cache_create_args,	\
+		default: __kmem_cache_create)(__name, __object_size, __args, __VA_ARGS__)
+
 void kmem_cache_destroy(struct kmem_cache *s);
 int kmem_cache_shrink(struct kmem_cache *s);
 
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 19ae3dd6e36f..418459927670 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -383,7 +383,7 @@  kmem_cache_create_usercopy(const char *name, unsigned int size,
 EXPORT_SYMBOL(kmem_cache_create_usercopy);
 
 /**
- * kmem_cache_create - Create a cache.
+ * __kmem_cache_create - Create a cache.
  * @name: A string which is used in /proc/slabinfo to identify this cache.
  * @size: The size of objects to be created in this cache.
  * @align: The required alignment for the objects.
@@ -407,9 +407,9 @@  EXPORT_SYMBOL(kmem_cache_create_usercopy);
  *
  * Return: a pointer to the cache on success, NULL on failure.
  */
-struct kmem_cache *
-kmem_cache_create(const char *name, unsigned int size, unsigned int align,
-		slab_flags_t flags, void (*ctor)(void *))
+struct kmem_cache *__kmem_cache_create(const char *name, unsigned int size,
+				       unsigned int align, slab_flags_t flags,
+				       void (*ctor)(void *))
 {
 	struct kmem_cache_args kmem_args = {
 		.align	= align,
@@ -418,7 +418,7 @@  kmem_cache_create(const char *name, unsigned int size, unsigned int align,
 
 	return __kmem_cache_create_args(name, size, &kmem_args, flags);
 }
-EXPORT_SYMBOL(kmem_cache_create);
+EXPORT_SYMBOL(__kmem_cache_create);
 
 /**
  * kmem_cache_create_rcu - Create a SLAB_TYPESAFE_BY_RCU cache.