From nobody Wed Sep 28 10:20:21 2022 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 4Mcsv95GJcz4dWWS; Wed, 28 Sep 2022 10:20:21 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Mcsv94Qlnz3GkW; Wed, 28 Sep 2022 10:20:21 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1664360421; 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=IQpmlC32KZUEgNfKOB1mnXDpcyLovYVVX9gHnSDrWpk=; b=c+EH+etgRnv5e4erITL7E07LC3R4J/89paxCHdzpuX9YoE6zDMEoo3go5bDtub+keVUHOv ttGh3bGmm6NGeMfX8onNNiVgFPQl3Sgtl+NYXDspDLna1gfgaITZmJTKGK7dF0uhD1cnCe pJiSXukz7DfAu2YQMGrE49yfrLjx5MsS2w0JfoUbdUzKo1o33DAvEhgNMLsoaO9muwG7XB YsGG/gbzF2H+tQVl1Crmj5N7U8pQq21xJp/UIB9TJMhvl5ZiSXTGiKpcz05VfbTMaHpjSL QTlEKEDjtAkDt01DZudpYLnGk/tV5/usl+ML3Z29E5Qy0m6EThOSLUT7/SCWjA== 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 4Mcsv938gczRSH; Wed, 28 Sep 2022 10:20:21 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 28SAKLI4037425; Wed, 28 Sep 2022 10:20:21 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 28SAKLHY037420; Wed, 28 Sep 2022 10:20:21 GMT (envelope-from git) Date: Wed, 28 Sep 2022 10:20:21 GMT Message-Id: <202209281020.28SAKLHY037420@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: "Alexander V. Chernikov" Subject: git: 7b660faa9e30 - main - sockbufs: add sbreserve_locked_limit() with custom maxsockbuf limit. 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: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: melifaro X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 7b660faa9e30c15d3be9b2c44c3ca046a33331f4 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1664360421; 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=IQpmlC32KZUEgNfKOB1mnXDpcyLovYVVX9gHnSDrWpk=; b=C8/ieVC+n1qW09ip+jsgUD87nWlx1JF3kY6AALqWl9gaheVaw/+SzkxTt6opCk/qJx7GpD A5yzIe5Kn9YDGii8ModWsqbOw2BYig2CBDG/aAfeRaUt3gvLGTJXonyNjZuLK6uXTDkCq1 T5Xm2yoJmcYMo8516rsje3l+GB9JwzzhjQqeg2R9eiPcRdOsxpMcz0vNZp1vPBT9mPv283 8Bw6mMUCEsqVMF38h/jxT5tYlnlUMaeOS3fdlJXbGS5RXKQfDvYeNBWf+9SCXZs1SCHhYE J5OMBAS1HLXA9Fmsj5EYfZWiF5yHs0KiASpNXZ87UBNpgZ/M/4FUdJ/tDvOs9g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1664360421; a=rsa-sha256; cv=none; b=E5cs9+pV18YmOqmh6StTQFyDmHaKLkdnhQRU29Z6a1CqblOsOiZi8/ncHRQO9J0xxhB5YT xdTlZe4C3dLPl5rSeHSPqtbMM6QgRe5ppyaeqrLv24rFALTwxmE8hY6bX9lBBd5JI3BUSU ORmX0Sct2PyPpd5PQ5nlKVp068cx7qfpduglfIFgKJfT71LEvThV3xQZSuOGCYlwNn9z/K /XYa9MziNYoYrXjVlwAu8+F3V+INpAhwtW1OagJUmjTAypd5Wv6Obw/RR9Q75R22qwtc8M 4ZrjSkpZYA8lN6aj4XwbUV1Zjbov20PzWa++XRSUj/isQeNXusQeCn1G1QPRow== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by melifaro: URL: https://cgit.FreeBSD.org/src/commit/?id=7b660faa9e30c15d3be9b2c44c3ca046a33331f4 commit 7b660faa9e30c15d3be9b2c44c3ca046a33331f4 Author: Alexander V. Chernikov AuthorDate: 2022-09-27 13:52:11 +0000 Commit: Alexander V. Chernikov CommitDate: 2022-09-28 10:20:09 +0000 sockbufs: add sbreserve_locked_limit() with custom maxsockbuf limit. Protocols such as netlink may need a large socket receive buffer, measured in tens of megabytes. This change allows netlink to set larger socket buffers (given the privs are in place), without requiring user to manuall bump maxsockbuf. Reviewed by: glebius Differential Revision: https://reviews.freebsd.org/D36747 --- sys/kern/uipc_sockbuf.c | 22 +++++++++++++++------- sys/sys/sockbuf.h | 2 ++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/sys/kern/uipc_sockbuf.c b/sys/kern/uipc_sockbuf.c index a2d3fc28bbec..61ec0c794270 100644 --- a/sys/kern/uipc_sockbuf.c +++ b/sys/kern/uipc_sockbuf.c @@ -66,9 +66,10 @@ void (*aio_swake)(struct socket *, struct sockbuf *); * Primitive routines for operating on socket buffers */ +#define BUF_MAX_ADJ(_sz) (((u_quad_t)(_sz)) * MCLBYTES / (MSIZE + MCLBYTES)) + u_long sb_max = SB_MAX; -u_long sb_max_adj = - (quad_t)SB_MAX * MCLBYTES / (MSIZE + MCLBYTES); /* adjusted sb_max */ +u_long sb_max_adj = BUF_MAX_ADJ(SB_MAX); static u_long sb_efficiency = 8; /* parameter for sbreserve() */ @@ -611,7 +612,7 @@ sysctl_handle_sb_max(SYSCTL_HANDLER_ARGS) if (tmp_sb_max < MSIZE + MCLBYTES) return (EINVAL); sb_max = tmp_sb_max; - sb_max_adj = (u_quad_t)sb_max * MCLBYTES / (MSIZE + MCLBYTES); + sb_max_adj = BUF_MAX_ADJ(sb_max); return (0); } @@ -620,8 +621,8 @@ sysctl_handle_sb_max(SYSCTL_HANDLER_ARGS) * become limiting if buffering efficiency is near the normal case. */ bool -sbreserve_locked(struct socket *so, sb_which which, u_long cc, - struct thread *td) +sbreserve_locked_limit(struct socket *so, sb_which which, u_long cc, + u_long buf_max, struct thread *td) { struct sockbuf *sb = sobuf(so, which); rlim_t sbsize_limit; @@ -635,7 +636,7 @@ sbreserve_locked(struct socket *so, sb_which which, u_long cc, * appropriate thread resource limits are available. In that case, * we don't apply a process limit. */ - if (cc > sb_max_adj) + if (cc > BUF_MAX_ADJ(buf_max)) return (false); if (td != NULL) { sbsize_limit = lim_cur(td, RLIMIT_SBSIZE); @@ -644,12 +645,19 @@ sbreserve_locked(struct socket *so, sb_which which, u_long cc, if (!chgsbsize(so->so_cred->cr_uidinfo, &sb->sb_hiwat, cc, sbsize_limit)) return (false); - sb->sb_mbmax = min(cc * sb_efficiency, sb_max); + sb->sb_mbmax = min(cc * sb_efficiency, buf_max); if (sb->sb_lowat > sb->sb_hiwat) sb->sb_lowat = sb->sb_hiwat; return (true); } +bool +sbreserve_locked(struct socket *so, sb_which which, u_long cc, + struct thread *td) +{ + return (sbreserve_locked_limit(so, which, cc, sb_max, td)); +} + int sbsetopt(struct socket *so, struct sockopt *sopt) { diff --git a/sys/sys/sockbuf.h b/sys/sys/sockbuf.h index a0c6fd10116a..33c0abb381a3 100644 --- a/sys/sys/sockbuf.h +++ b/sys/sys/sockbuf.h @@ -231,6 +231,8 @@ void sbrelease_locked(struct socket *, sb_which); int sbsetopt(struct socket *so, struct sockopt *); bool sbreserve_locked(struct socket *so, sb_which which, u_long cc, struct thread *td); +bool sbreserve_locked_limit(struct socket *so, sb_which which, u_long cc, + u_long buf_max, struct thread *td); void sbsndptr_adv(struct sockbuf *sb, struct mbuf *mb, u_int len); struct mbuf * sbsndptr_noadv(struct sockbuf *sb, u_int off, u_int *moff);