git: 0480918c0904 - stable/14 - socket: Split up soreceive_generic()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 03 Sep 2024 14:55:05 UTC
The branch stable/14 has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=0480918c09042ce6a71733a53a562152af035564
commit 0480918c09042ce6a71733a53a562152af035564
Author: Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2024-08-19 14:20:19 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2024-09-03 14:54:43 +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
(cherry picked from commit 0a68f644dca19670686007071479f919a56ea37f)
---
sys/kern/uipc_socket.c | 61 ++++++++++++++++++++++++++++++++------------------
1 file changed, 39 insertions(+), 22 deletions(-)
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index 8a688e41ee88..99073121d7de 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -2016,11 +2016,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;
@@ -2029,30 +2029,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;
- if ((pr->pr_flags & PR_WANTRCVD) && (so->so_state & SS_ISCONFIRMING)
- && uio->uio_resid) {
- VNET_SO_ASSERT(so);
- pr->pr_rcvd(so, 0);
- }
-
- error = SOCK_IO_RECV_LOCK(so, SBLOCKWAIT(flags));
- if (error)
- return (error);
restart:
SOCKBUF_LOCK(&so->so_rcv);
@@ -2510,6 +2495,38 @@ 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;
+ if ((so->so_proto->pr_flags & PR_WANTRCVD) &&
+ (so->so_state & SS_ISCONFIRMING) && uio->uio_resid) {
+ VNET_SO_ASSERT(so);
+ so->so_proto->pr_rcvd(so, 0);
+ }
+
+ 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);
}