Diff below remove an unnecessary unlock/relock dance when following the 'goto restart'.
ok? Index: kern/uipc_socket.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_socket.c,v retrieving revision 1.211 diff -u -p -r1.211 uipc_socket.c --- kern/uipc_socket.c 18 Dec 2017 10:07:55 -0000 1.211 +++ kern/uipc_socket.c 18 Dec 2017 13:41:06 -0000 @@ -668,8 +668,8 @@ bad: if (mp) *mp = NULL; -restart: s = solock(so); +restart: if ((error = sblock(so, &so->so_rcv, SBLOCKWAIT(flags))) != 0) { sounlock(s); return (error); @@ -738,9 +738,10 @@ restart: SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 1"); sbunlock(so, &so->so_rcv); error = sbwait(so, &so->so_rcv); - sounlock(s); - if (error) + if (error) { + sounlock(s); return (error); + } goto restart; } dontblock: @@ -994,7 +995,6 @@ dontblock: if (orig_resid == uio->uio_resid && orig_resid && (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) { sbunlock(so, &so->so_rcv); - sounlock(s); goto restart; }