The branch main has been updated by markj:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=0a68f644dca19670686007071479f919a56ea37f

commit 0a68f644dca19670686007071479f919a56ea37f
Author:     Mark Johnston <ma...@freebsd.org>
AuthorDate: 2024-08-19 14:20:19 +0000
Commit:     Mark Johnston <ma...@freebsd.org>
CommitDate: 2024-08-19 14:37:27 +0000

    socket: Split up soreceive_generic()
    
    Factor out the bits that run with the sock I/O lock held into a separate
    function.  No functional change intended.
    
    Reviewed by:    gallatin, glebius
    MFC after:      2 weeks
    Sponsored by:   Klara, Inc.
    Sponsored by:   Stormshield
    Differential Revision:  https://reviews.freebsd.org/D46304
---
 sys/kern/uipc_socket.c | 51 +++++++++++++++++++++++++++++++++-----------------
 1 file changed, 34 insertions(+), 17 deletions(-)

diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index 5886c7ac84f4..e7c4a85d5970 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -2070,11 +2070,11 @@ sockbuf_pushsync(struct sockbuf *sb, struct mbuf 
*nextrecord)
  * mbuf **mp0 for use in returning the chain.  The uio is then used only for
  * the count in uio_resid.
  */
-int
-soreceive_generic(struct socket *so, struct sockaddr **psa, struct uio *uio,
-    struct mbuf **mp0, struct mbuf **controlp, int *flagsp)
+static int
+soreceive_generic_locked(struct socket *so, struct sockaddr **psa,
+    struct uio *uio, struct mbuf **mp, struct mbuf **controlp, int *flagsp)
 {
-       struct mbuf *m, **mp;
+       struct mbuf *m;
        int flags, error, offset;
        ssize_t len;
        struct protosw *pr = so->so_proto;
@@ -2083,25 +2083,15 @@ soreceive_generic(struct socket *so, struct sockaddr 
**psa, struct uio *uio,
        ssize_t orig_resid = uio->uio_resid;
        bool report_real_len = false;
 
-       mp = mp0;
-       if (psa != NULL)
-               *psa = NULL;
-       if (controlp != NULL)
-               *controlp = NULL;
+       SOCK_IO_RECV_ASSERT_LOCKED(so);
+
+       error = 0;
        if (flagsp != NULL) {
                report_real_len = *flagsp & MSG_TRUNC;
                *flagsp &= ~MSG_TRUNC;
                flags = *flagsp &~ MSG_EOR;
        } else
                flags = 0;
-       if (flags & MSG_OOB)
-               return (soreceive_rcvoob(so, uio, flags));
-       if (mp != NULL)
-               *mp = NULL;
-
-       error = SOCK_IO_RECV_LOCK(so, SBLOCKWAIT(flags));
-       if (error)
-               return (error);
 
 restart:
        SOCKBUF_LOCK(&so->so_rcv);
@@ -2559,6 +2549,33 @@ dontblock:
        if (flagsp != NULL)
                *flagsp |= flags;
 release:
+       return (error);
+}
+
+int
+soreceive_generic(struct socket *so, struct sockaddr **psa, struct uio *uio,
+    struct mbuf **mp, struct mbuf **controlp, int *flagsp)
+{
+       int error, flags;
+
+       if (psa != NULL)
+               *psa = NULL;
+       if (controlp != NULL)
+               *controlp = NULL;
+       if (flagsp != NULL) {
+               flags = *flagsp;
+               if ((flags & MSG_OOB) != 0)
+                       return (soreceive_rcvoob(so, uio, flags));
+       } else {
+               flags = 0;
+       }
+       if (mp != NULL)
+               *mp = NULL;
+
+       error = SOCK_IO_RECV_LOCK(so, SBLOCKWAIT(flags));
+       if (error)
+               return (error);
+       error = soreceive_generic_locked(so, psa, uio, mp, controlp, flagsp);
        SOCK_IO_RECV_UNLOCK(so);
        return (error);
 }

Reply via email to