From nobody Sun Apr 12 18:35:39 2026 X-Original-To: dev-commits-src-main@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 4ftzkN37Xqz6YVY3 for ; Sun, 12 Apr 2026 18:35:40 +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 "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ftzkN0CrLz3ZyB for ; Sun, 12 Apr 2026 18:35:40 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1776018940; 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=pkJYbwWjS0IWf7C5xb1M8NJ+MUKecr7DE/MdznrojPU=; b=tnnYpx8c+bamuVI1EaRGSE0lcVfki1PMaigXPI+Dc0eMjDM5gBcexLz1TCfT2ZWpyy9Niq eYTxcdARoCZFiHPo9cs/1ruQeyotM08h7Q0miy34tENS8J520ufGP8B32QDM9UQ6lMz/A2 ED9LqfY6Z+m6ftqw/D8EdXbbbm8Z9opHcYvg9AypocMKjJ3ZwPVom4ioz7ILnCAU91Sl3J KNgsBEdrwiKcy67THyqnNQ91Zm1AaPwicDZjQqHfXj9YGKZZrSkEWIRKhr+Bq0Alj8aoxn JbuMBKH7Hj4yrD28AXwHcJHSRqENEAASOqIGMkniNBzOmVyc9dgk7hB5ILGLFg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1776018940; a=rsa-sha256; cv=none; b=gDX9zJWc5vEBjl8KY7oRw9OUQPM2yX1rnLZPHcDLHcGLowjEfXxwuEwAee+xJGJo9KBZ3X 9T4+4IBHdjUMAQa8wgbreqzGWWqG/ug/BWPh0zRPoxpNRN3Nhj6GoTLPui41Ly5WYzdEjO 2o9rjQfcCWU3Hg3YGmxZZC2fsbOgiMfo5csRIAefeOSg88hNQ888u0FNCURPvS5QVCTwNA 1oE40zJh/sYajdhdPXqdg2ORlO4i7f+OEhF1ljSnx2WoKDR0UWp+EbI6OlxmivGlYogijI 3tut9M38CFo3ejE9dW1M04gYyXdI6sE+9ODU3jFGR7aD3g/tDWIcgJp5WpVt2Q== 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=1776018940; 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=pkJYbwWjS0IWf7C5xb1M8NJ+MUKecr7DE/MdznrojPU=; b=Sz0nj7iso5ncT2KhXenQyE3nwr5quBaeqDBnYNv8tzW5TUqAC+nGUit+UqOuLyxvPKOSiO 03w3rmTWpMPMcqYq/FNaKyFHjqqRxGch/YtIPYKMAlPIs/AsqL9yFBpslConveAHNSpPdj 9NcdVUSSDJBIS3X3HdF4kntkoxJUV/QscxfBNnqOvgzW/qEej4jMCRN6MyD0CcPxIBXKJ2 oMK3W9OFMsf7EqDov5L6fPG/Fj0s0SRyFKkmevsaatFdBpWt1Zu8ufRnBFMgJ64dWYzQvi tRilQJNhYy90vvLspv4fWB0bPYKU2gJeO53NNaJKi3ADETfoBYIeJ076Elqcww== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4ftzkM6llLzDWP for ; Sun, 12 Apr 2026 18:35:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3a0da by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 12 Apr 2026 18:35:39 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Gleb Smirnoff Subject: git: acb79b56b1eb - main - udp: make in_pcbbind_setup() acquire the hash lock internally List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: glebius X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: acb79b56b1eb9ccd3efb519b6527116714ebf876 Auto-Submitted: auto-generated Date: Sun, 12 Apr 2026 18:35:39 +0000 Message-Id: <69dbe5fb.3a0da.42de0432@gitrepo.freebsd.org> The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=acb79b56b1eb9ccd3efb519b6527116714ebf876 commit acb79b56b1eb9ccd3efb519b6527116714ebf876 Author: Gleb Smirnoff AuthorDate: 2026-04-12 18:33:51 +0000 Commit: Gleb Smirnoff CommitDate: 2026-04-12 18:33:51 +0000 udp: make in_pcbbind_setup() acquire the hash lock internally Reviewed by: pouria, rrs, markj Differential Revision: https://reviews.freebsd.org/D55973 --- sys/netinet/in_pcb.c | 99 +++++++++++++++++++++++++++--------------------- sys/netinet/udp_usrreq.c | 4 -- 2 files changed, 56 insertions(+), 47 deletions(-) diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index 69974d931e44..29214fbd2cf6 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -714,46 +714,6 @@ out: #endif } -#ifdef INET -int -in_pcbbind(struct inpcb *inp, struct sockaddr_in *sin, int flags, - struct ucred *cred) -{ - int error; - bool anonport; - - KASSERT(sin == NULL || sin->sin_family == AF_INET, - ("%s: invalid address family for %p", __func__, sin)); - KASSERT(sin == NULL || sin->sin_len == sizeof(struct sockaddr_in), - ("%s: invalid address length for %p", __func__, sin)); - INP_WLOCK_ASSERT(inp); - - if (inp->inp_lport != 0 || inp->inp_laddr.s_addr != INADDR_ANY) - return (EINVAL); - anonport = sin == NULL || sin->sin_port == 0; - - INP_HASH_WLOCK(inp->inp_pcbinfo); - error = in_pcbbind_setup(inp, sin, &inp->inp_laddr.s_addr, - &inp->inp_lport, flags, cred); - if (error) { - INP_HASH_WUNLOCK(inp->inp_pcbinfo); - return (error); - } - if (__predict_false((error = in_pcbinshash(inp)) != 0)) { - INP_HASH_WUNLOCK(inp->inp_pcbinfo); - MPASS(inp->inp_socket->so_options & SO_REUSEPORT_LB); - inp->inp_laddr.s_addr = INADDR_ANY; - inp->inp_lport = 0; - inp->inp_flags &= ~INP_BOUNDFIB; - return (error); - } - INP_HASH_WUNLOCK(inp->inp_pcbinfo); - if (anonport) - inp->inp_flags |= INP_ANONPORT; - return (0); -} -#endif - #if defined(INET) || defined(INET6) /* * Assign a local port like in_pcb_lport(), but also used with connect() @@ -1016,9 +976,9 @@ in_pcbbind_avail(struct inpcb *inp, const struct in_addr laddr, * * On error, the values of *laddrp and *lportp are not changed. */ -int -in_pcbbind_setup(struct inpcb *inp, struct sockaddr_in *sin, in_addr_t *laddrp, - u_short *lportp, int flags, struct ucred *cred) +static int +in_pcbbind_setup_locked(struct inpcb *inp, struct sockaddr_in *sin, + in_addr_t *laddrp, u_short *lportp, int flags, struct ucred *cred) { struct socket *so = inp->inp_socket; struct in_addr laddr; @@ -1082,6 +1042,59 @@ in_pcbbind_setup(struct inpcb *inp, struct sockaddr_in *sin, in_addr_t *laddrp, return (0); } +int +in_pcbbind_setup(struct inpcb *inp, struct sockaddr_in *sin, in_addr_t *laddrp, + u_short *lportp, int flags, struct ucred *cred) +{ + int error; + + INP_HASH_WLOCK(inp->inp_pcbinfo); + error = in_pcbbind_setup_locked(inp, sin, laddrp, lportp, flags, cred); + INP_HASH_WUNLOCK(inp->inp_pcbinfo); + + return (error); +} + +#ifdef INET +int +in_pcbbind(struct inpcb *inp, struct sockaddr_in *sin, int flags, + struct ucred *cred) +{ + int error; + bool anonport; + + KASSERT(sin == NULL || sin->sin_family == AF_INET, + ("%s: invalid address family for %p", __func__, sin)); + KASSERT(sin == NULL || sin->sin_len == sizeof(struct sockaddr_in), + ("%s: invalid address length for %p", __func__, sin)); + INP_WLOCK_ASSERT(inp); + + if (inp->inp_lport != 0 || inp->inp_laddr.s_addr != INADDR_ANY) + return (EINVAL); + anonport = sin == NULL || sin->sin_port == 0; + + INP_HASH_WLOCK(inp->inp_pcbinfo); + error = in_pcbbind_setup_locked(inp, sin, &inp->inp_laddr.s_addr, + &inp->inp_lport, flags, cred); + if (error) { + INP_HASH_WUNLOCK(inp->inp_pcbinfo); + return (error); + } + if (__predict_false((error = in_pcbinshash(inp)) != 0)) { + INP_HASH_WUNLOCK(inp->inp_pcbinfo); + MPASS(inp->inp_socket->so_options & SO_REUSEPORT_LB); + inp->inp_laddr.s_addr = INADDR_ANY; + inp->inp_lport = 0; + inp->inp_flags &= ~INP_BOUNDFIB; + return (error); + } + INP_HASH_WUNLOCK(inp->inp_pcbinfo); + if (anonport) + inp->inp_flags |= INP_ANONPORT; + return (0); +} +#endif + /* * Connect from a socket to a specified address. * Both address and port must be specified in argument sin. diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index a94e1ec813c4..b973b299ca56 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -1117,7 +1117,6 @@ udp_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr, int len, error = 0; struct in_addr faddr, laddr; struct cmsghdr *cm; - struct inpcbinfo *pcbinfo; struct sockaddr_in *sin, src; struct epoch_tracker et; int cscov_partial = 0; @@ -1289,7 +1288,6 @@ udp_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr, goto release; pr = inp->inp_socket->so_proto->pr_protocol; - pcbinfo = udp_get_inpcbinfo(pr); /* * If the IP_SENDSRCADDR control message was specified, override the @@ -1310,10 +1308,8 @@ udp_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr, inp->inp_vflag |= INP_IPV4; inp->inp_vflag &= ~INP_IPV6; } - INP_HASH_WLOCK(pcbinfo); error = in_pcbbind_setup(inp, &src, &laddr.s_addr, &lport, V_udp_bind_all_fibs ? 0 : INPBIND_FIB, td->td_ucred); - INP_HASH_WUNLOCK(pcbinfo); if ((flags & PRUS_IPV6) != 0) inp->inp_vflag = vflagsav; if (error)