From nobody Mon Aug 19 14:37:43 2024 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4WnZvD27BTz5T8Gy; Mon, 19 Aug 2024 14:37:44 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4WnZvC5Q19z4v7G; Mon, 19 Aug 2024 14:37:43 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1724078263; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=3Q1j114JbbcVQa/dHb57bxs+eHckYuxSOsUIhj3nJJo=; b=IGbUcdBSBb7q5dJHkqjrCjM6cJchr1hjK/G0PZU6NrMrDc7HmCMoaBSSHg4fJme5w3pbJy xHYH17OKu+pNS8fGMemb9hz7kgzn5Yl8aisB4runREJGqwCpmqm9gg9STgHMLL58tWQ0mx 5wxObj2GXqR93ElSoMme4IR9VfVGvFniXZ+Ds4J2f6zjevnhCfV9zQQqr3ctqRrSCjXjc4 7D+OQunV1a3LgfHadHii4Y2sKnaqtndCCIqY2HXK4Zn4kUrqTNJuhfr8EOKvCOgGNChGcj LUUvy/2+w71GWDu0hWBDULeJ3CEjb6F9mZ2bdySt2DnhuxfLEg3/vmynFc5JDw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1724078263; a=rsa-sha256; cv=none; b=lTfSu+eJqVHZzJv4RIPLUL0DuiOpd3UvSaLVCNWAZHC4Czf3mbRlfVKX7hM2CIVSyPbDrk kSUqoJ0SsryehFZ8kuU8pRdDQt7EqUYe0y7jD84sOfgePe9Yj+R4toK+bibrb+ovmweGVy FImnyupJeI6J/JpuE0e6H3DDuWFku1KYWWIg6I7Ck2HfwhwP8IPA1D03Y7QnFNHqU5WSMK bSEd3nCdMhlG+HAtYlX8uX6p+q8StSEcx7Mz3EnY3TpeOaWoGaWKutbz9pw61+GE62oiXy lZcXYRP+YDpv6ouIy4/WX20Z9TOlx+fhMzdleEhlx+/UaEMDzQaAkeP/5BjW2A== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1724078263; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=3Q1j114JbbcVQa/dHb57bxs+eHckYuxSOsUIhj3nJJo=; b=c2oodQrBp1HVGSSL7AU07z9fV2WHJBiaELvxI1WE1rDlQcqi+sGVsHN2+Tl6glnH6TWF8O jG9Sv+/q5Ihxd89DHNZ5gUwOfG1ixKEwe+393/9HUxgB6J3CPJqLjmb6RR6VaIgpWaLxUp 3mDI31MTi8PjOG52TXnyslivIeENvy/7GVSf7OxmyiDm2MetDyvwEtqMi0AsbAFjam7mmm m30JNnBn0RLEG3wVsSXpreajqlPOsPSpWOUir5PBSxDnHzIZQN165LWQaDHf4Rohy+YEjY /AjDp6XoRBVRHf7pzYMuGKSpaWGKttCEImHb5/POLfMGdZMXauvuy4attaUPMw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4WnZvC4lWzzKqt; Mon, 19 Aug 2024 14:37:43 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 47JEbhBu094261; Mon, 19 Aug 2024 14:37:43 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 47JEbhOG094258; Mon, 19 Aug 2024 14:37:43 GMT (envelope-from git) Date: Mon, 19 Aug 2024 14:37:43 GMT Message-Id: <202408191437.47JEbhOG094258@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mark Johnston Subject: git: fb901935f257 - main - socket: Split up sosend_generic() List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: markj X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: fb901935f257ddcc492fe9efb605797f181c6597 Auto-Submitted: auto-generated The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=fb901935f257ddcc492fe9efb605797f181c6597 commit fb901935f257ddcc492fe9efb605797f181c6597 Author: Mark Johnston AuthorDate: 2024-08-19 14:20:43 +0000 Commit: Mark Johnston CommitDate: 2024-08-19 14:37:27 +0000 socket: Split up sosend_generic() Factor out the bits that run with the sock I/O lock held into a separate function. In this implementation, we are doing a bit more work under the I/O lock than before. However, lock contention is only a problem when multiple threads are transmitting on the same socket, which is an unusual case that is not expected to perform well in any case. 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/D46305 --- sys/kern/uipc_socket.c | 47 +++++++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index e7c4a85d5970..a5e88fc7ffc6 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -1656,8 +1656,8 @@ out: * counts if EINTR/ERESTART are returned. Data and control buffers are freed * on return. */ -int -sosend_generic(struct socket *so, struct sockaddr *addr, struct uio *uio, +static int +sosend_generic_locked(struct socket *so, struct sockaddr *addr, struct uio *uio, struct mbuf *top, struct mbuf *control, int flags, struct thread *td) { long space; @@ -1673,6 +1673,9 @@ sosend_generic(struct socket *so, struct sockaddr *addr, struct uio *uio, tls = NULL; tls_rtype = TLS_RLTYPE_APP; #endif + + SOCK_IO_SEND_ASSERT_LOCKED(so); + if (uio != NULL) resid = uio->uio_resid; else if ((top->m_flags & M_PKTHDR) != 0) @@ -1702,10 +1705,6 @@ sosend_generic(struct socket *so, struct sockaddr *addr, struct uio *uio, if (control != NULL) clen = control->m_len; - error = SOCK_IO_SEND_LOCK(so, SBLOCKWAIT(flags)); - if (error) - goto out; - #ifdef KERN_TLS tls_send_flag = 0; tls = ktls_hold(so->so_snd.sb_tls_info); @@ -1728,7 +1727,7 @@ sosend_generic(struct socket *so, struct sockaddr *addr, struct uio *uio, if (resid == 0 && !ktls_permit_empty_frames(tls)) { error = EINVAL; - goto release; + goto out; } } #endif @@ -1739,13 +1738,13 @@ restart: if (so->so_snd.sb_state & SBS_CANTSENDMORE) { SOCKBUF_UNLOCK(&so->so_snd); error = EPIPE; - goto release; + goto out; } if (so->so_error) { error = so->so_error; so->so_error = 0; SOCKBUF_UNLOCK(&so->so_snd); - goto release; + goto out; } if ((so->so_state & SS_ISCONNECTED) == 0) { /* @@ -1759,7 +1758,7 @@ restart: if (!(resid == 0 && clen != 0)) { SOCKBUF_UNLOCK(&so->so_snd); error = ENOTCONN; - goto release; + goto out; } } else if (addr == NULL) { SOCKBUF_UNLOCK(&so->so_snd); @@ -1767,7 +1766,7 @@ restart: error = ENOTCONN; else error = EDESTADDRREQ; - goto release; + goto out; } } space = sbspace(&so->so_snd); @@ -1777,7 +1776,7 @@ restart: clen > so->so_snd.sb_hiwat) { SOCKBUF_UNLOCK(&so->so_snd); error = EMSGSIZE; - goto release; + goto out; } if (space < resid + clen && (atomic || space < so->so_snd.sb_lowat || space < clen)) { @@ -1785,12 +1784,12 @@ restart: (flags & (MSG_NBIO | MSG_DONTWAIT)) != 0) { SOCKBUF_UNLOCK(&so->so_snd); error = EWOULDBLOCK; - goto release; + goto out; } error = sbwait(so, SO_SND); SOCKBUF_UNLOCK(&so->so_snd); if (error) - goto release; + goto out; goto restart; } SOCKBUF_UNLOCK(&so->so_snd); @@ -1835,7 +1834,7 @@ restart: ((flags & MSG_EOR) ? M_EOR : 0)); if (top == NULL) { error = EFAULT; /* only possible error */ - goto release; + goto out; } space -= resid - uio->uio_resid; resid = uio->uio_resid; @@ -1899,12 +1898,10 @@ restart: control = NULL; top = NULL; if (error) - goto release; + goto out; } while (resid && space > 0); } while (resid); -release: - SOCK_IO_SEND_UNLOCK(so); out: #ifdef KERN_TLS if (tls != NULL) @@ -1917,6 +1914,20 @@ out: return (error); } +int +sosend_generic(struct socket *so, struct sockaddr *addr, struct uio *uio, + struct mbuf *top, struct mbuf *control, int flags, struct thread *td) +{ + int error; + + error = SOCK_IO_SEND_LOCK(so, 0); + if (error) + return (error); + error = sosend_generic_locked(so, addr, uio, top, control, flags, td); + SOCK_IO_SEND_UNLOCK(so); + return (error); +} + /* * Send to a socket from a kernel thread. *