Re: [PATCH] vfs: inline getname()
From: Jan Kara
Date: Thu Feb 06 2025 - 04:03:03 EST
On Thu 06-02-25 01:01:05, Mateusz Guzik wrote:
> It is merely a trivial wrapper around getname_flags which adds a zeroed
> argument, no point paying for an extra call.
>
> Signed-off-by: Mateusz Guzik <mjguzik@xxxxxxxxx>
Well, the "extra call" in your changelog is a bit overrated. Such wrappers
get compiled into a constant jump anyway - e.g. in my kernel:
Dump of assembler code for function getname:
0xffffffff815edb80 <+0>: endbr64
0xffffffff815edb84 <+4>: call 0xffffffff8131cad0 <__fentry__>
0xffffffff815edb89 <+9>: xor %esi,%esi
0xffffffff815edb8b <+11>: jmp 0xffffffff815ed750 <getname_flags>
And the jmp to constant is practically free on current CPUs.
Overall inline function for this is I guess a more common way how we do
things like this so feel free to add:
Reviewed-by: Jan Kara <jack@xxxxxxx>
Honza
> ---
> fs/namei.c | 5 -----
> include/linux/fs.h | 5 ++++-
> 2 files changed, 4 insertions(+), 6 deletions(-)
>
> diff --git a/fs/namei.c b/fs/namei.c
> index 3ab9440c5b93..3a4039acdb3f 100644
> --- a/fs/namei.c
> +++ b/fs/namei.c
> @@ -218,11 +218,6 @@ struct filename *getname_uflags(const char __user *filename, int uflags)
> return getname_flags(filename, flags);
> }
>
> -struct filename *getname(const char __user * filename)
> -{
> - return getname_flags(filename, 0);
> -}
> -
> struct filename *__getname_maybe_null(const char __user *pathname)
> {
> struct filename *name;
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index e73d9b998780..85d88dd5ab6c 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -2840,7 +2840,10 @@ extern int filp_close(struct file *, fl_owner_t id);
>
> extern struct filename *getname_flags(const char __user *, int);
> extern struct filename *getname_uflags(const char __user *, int);
> -extern struct filename *getname(const char __user *);
> +static inline struct filename *getname(const char __user *name)
> +{
> + return getname_flags(name, 0);
> +}
> extern struct filename *getname_kernel(const char *);
> extern struct filename *__getname_maybe_null(const char __user *);
> static inline struct filename *getname_maybe_null(const char __user *name, int flags)
> --
> 2.43.0
>
--
Jan Kara <jack@xxxxxxxx>
SUSE Labs, CR