Index | Thread | Search

From:
Alexandr Nedvedicky <sashan@fastmail.net>
Subject:
Re: somove send buffer
To:
Alexander Bluhm <bluhm@openbsd.org>
Cc:
tech@openbsd.org
Date:
Sun, 14 Jul 2024 13:01:50 +0200

Download raw body.

Thread
  • Alexander Bluhm:

    somove send buffer

    • Alexandr Nedvedicky:

      somove send buffer

Hello,

makes sense.

OK sashan

On Sun, Jul 14, 2024 at 10:12:48AM +0200, Alexander Bluhm wrote:
> Hi,
> 
> When I looked through somove() which buffer has to be locked, I
> found that the wrong socket is used in one place.
> 
> Variable so is the source socket and sosp is the drain.
> 
> If we have a large mbuf in the source socket buffer that does not
> fit into the drain buffer, we split the mbuf.  But if the drain
> buffer still has some data in it, stop moving data and try again
> later.  This skips a potentially expensive mbuf operation.
> 
> As this is a performance optimization for a special corner case,
> noone noticed the bug.
> 
> ok?
> 
> bluhm
> 
> Index: kern/uipc_socket.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/kern/uipc_socket.c,v
> diff -u -p -r1.337 uipc_socket.c
> --- kern/uipc_socket.c	12 Jul 2024 17:20:18 -0000	1.337
> +++ kern/uipc_socket.c	13 Jul 2024 15:08:25 -0000
> @@ -1690,7 +1690,7 @@ somove(struct socket *so, int wait)
>  			 * Move only a partial mbuf at maximum splice length or
>  			 * if the drain buffer is too small for this large mbuf.
>  			 */
> -			if (!maxreached && so->so_snd.sb_datacc > 0) {
> +			if (!maxreached && sosp->so_snd.sb_datacc > 0) {
>  				len -= size;
>  				break;
>  			}
>