[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <7exbpvo4svpmhk7n7sjq55wlaqhndk3qk2ijw7y4dvykqbhg3n@y5axd74zos5i>
Date: Thu, 6 Feb 2025 10:02:35 +0100
From: Jan Kara <jack@...e.cz>
To: Mateusz Guzik <mjguzik@...il.com>
Cc: brauner@...nel.org, viro@...iv.linux.org.uk, jack@...e.cz,
linux-kernel@...r.kernel.org, linux-fsdevel@...r.kernel.org
Subject: Re: [PATCH] vfs: inline getname()
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@...il.com>
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@...e.cz>
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@...e.com>
SUSE Labs, CR
Powered by blists - more mailing lists