Re: [PATCH 06/39] net/socket.c: switch to CLASS(fd)

Christian Brauner
2024-08-07T10:13:21Z

On Tue, Jul 30, 2024 at 01:15:52AM GMT, viro@kernel.org wrote:
> From: Al Viro <viro@zeniv.linux.org.uk>
>
> I strongly suspect that important part in sockfd_lookup_light()
> is avoiding needless file refcount operations, not the marginal reduction
> of the register pressure from not keeping a struct file pointer in
> the caller.
>
> If that's true, we should get the same benefits from straight
> fdget()/fdput(). And AFAICS with sane use of CLASS(fd) we can get a
> better code generation...
>
> Would be nice if somebody tested it on networking test suites
> (including benchmarks)...
>
> sockfd_lookup_light() does fdget(), uses sock_from_file() to
> get the associated socket and returns the struct socket reference to
> the caller, along with "do we need to fput()" flag. No matching fdput(),
> the caller does its equivalent manually, using the fact that sock->file
> points to the struct file the socket has come from.
>
> Get rid of that - have the callers do fdget()/fdput() and
> use sock_from_file() directly. That kills sockfd_lookup_light()
> and fput_light() (no users left).
>
> What's more, we can get rid of explicit fdget()/fdput() by
> switching to CLASS(fd, ...) - code generation does not suffer, since
> now fdput() inserted on "descriptor is not opened" failure exit
> is recognized to be a no-op by compiler.
>
> We could split that commit in two (getting rid of sockd_lookup_light()
> and switch to CLASS(fd, ...)), but AFAICS it ends up being harder to read
> that way.
>
> [conflicts in a couple of functions]
>
> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
> ---

Reviewed-by: Christian Brauner <brauner@kernel.org>