From: Alexandr Nedvedicky Subject: Re: somove send buffer To: Alexander Bluhm Cc: tech@openbsd.org Date: Sun, 14 Jul 2024 13:01:50 +0200 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; > } >