Index | Thread | Search

From:
Alexander Bluhm <bluhm@openbsd.org>
Subject:
Re: sosplice(): remove socket state and options checks in unsplice path
To:
Vitaliy Makkoveev <mvs@openbsd.org>
Cc:
tech@openbsd.org
Date:
Thu, 2 Jan 2025 18:11:12 +0100

Download raw body.

Thread
On Thu, Jan 02, 2025 at 12:18:25PM +0300, Vitaliy Makkoveev wrote:
> In ancient times the unsplicing path was the part of splicing, so it
> follows these checks too. While doing sosplice() reorder, I left them to
> keep API as is, but now I want to remove these checks. Socket splicing
> is about socket buffers which have their own locks, so socket locks
> are not required for splicing and unsplicing, moreover socket splicing
> relays on sblock() on so_rcv, not the solock(). I want to move solock()
> down to sonsplice() and keep it only around optional sor{r,w}akeup(),
> so these useless checks before sounsplice() brings nothing, but requires
> to take solock() and stop packet processing.
> 
> I performed kern/sosplice tests without any issues, so I suspect this
> API change will be transparent.

OK bluhm@

> Index: sys/kern/uipc_socket.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_socket.c,v
> diff -u -p -r1.352 uipc_socket.c
> --- sys/kern/uipc_socket.c	31 Dec 2024 12:19:46 -0000	1.352
> +++ sys/kern/uipc_socket.c	2 Jan 2025 09:04:18 -0000
> @@ -1338,22 +1338,11 @@ sosplice(struct socket *so, int fd, off_
>  		if ((error = sblock(&so->so_rcv, SBL_WAIT)) != 0)
>  			return (error);
>  		solock(so);
> -		if (so->so_options & SO_ACCEPTCONN) {
> -			error = EOPNOTSUPP;
> -			goto out;
> -		}
> -		if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) == 0 &&
> -		    (so->so_proto->pr_flags & PR_CONNREQUIRED)) {
> -			error = ENOTCONN;
> -			goto out;
> -		}
> -
>  		if (so->so_sp && so->so_sp->ssp_socket)
>  			sounsplice(so, so->so_sp->ssp_socket, 0);
> - out:
>  		sounlock(so);
>  		sbunlock(&so->so_rcv);
> -		return (error);
> +		return (0);
>  	}
>  
>  	if (sosplice_taskq == NULL) {