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;
}