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

Reply via email to