From nobody Fri May 23 22:52:53 2025 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 4b40mk3jrlz5wj3y; Fri, 23 May 2025 22:52:54 +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 4b40mk1NvFz3st8; Fri, 23 May 2025 22:52:54 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1748040774; 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=tvKaEuYP+xQYwm/b9WdZi3/hrvaF5cP1XGp5CKgaCUo=; b=Aq4/RLE6L0pdMursVUwnVeXXAyvnVhrQwQhxJ55DPPMKv1HcSXJuH9DgtVc/NTSkW8ZI3B PFpHB7IZDJxKV8vbuU4d5KJAgSYXN9XF7krHw8Xw3YDwUvexSe//wPTcI5dOFBoTDuYTDm qCWhU/r0sWZvYi5S3pxTVSlHO4Kn9U6XuZNWoq6MZVctIuUbz1Gv7/LcNZVVkKSpFcxBfG x0UV/OhE461RxqUJCo8rwm4lzxgILrs+doqWFYQJhokQMtlkPBdRxZ21g1/e3YP5/QylkK uAgpSn24gKs5tSSMGafVN7/+ZSYm8VuSRhZYopcRyDwuSHtvO1NX/o+JvKVhdQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1748040774; 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=tvKaEuYP+xQYwm/b9WdZi3/hrvaF5cP1XGp5CKgaCUo=; b=CyfzIZNkXZPL9Z3wSgci+vgkNiMBnc4NisxPVUdWMFvvbNgtCoYh6sQG38qX5qOZy96Oc1 z/WCcF+OgD9+L/8bMd3TRvVOMHeQJ4JJSiq0aJJuk9tmlWTEiRQHZhB8AQ136z+vg3D1x4 FYluKdYKmhmd3sp836NpcbOoZySB2xsAMtWk2GbpB6XUKf83H5AKUyAMQGOEa1rqbdvIIo 2e0NN77L5MT8oEzrEsMfln0zKSbmkmM84k4NmJ5PSgHoWVDGipjVFWM8HLis+g9KoIH4wM /wNIerpjmkeiqMLF44qya1gFUbFdvfOgNqxz0w9+emMkM1kLV4TsOh402uUS5w== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1748040774; a=rsa-sha256; cv=none; b=RvL4H01zE8P2FkYj9+TiapgaYpjItooEb1tTvgEE8dewCXS3Jywb3iVc7bwiQzEa5hMta6 2mUOMg7jM3sHcA3NCdpbLMfihsGat7CG6/f6BHwrLvxLbawDxeGwDB2r6UxTzNH3zbM2yj UP0UngHHi/dp/MpQhlSQFhQZVpZjS1+1c0cYuDzbMuar4GGsQFXbPiNQ8FOBCXw/kZlm8e 9wAyOE1wdvyrxthp+ykmDzFbv3h/10P+DSHmoAsPr3kgol33kiv0sbQlioF9h6T+HxzYjG alML00dtJ84hs9WjEpOT5OXZPUqFAc+NgjpuKvNwwnvDUtcy6qngrmI05G9wxA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none 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 4b40mk0ZK7z1Ntc; Fri, 23 May 2025 22:52:54 +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 54NMqrlW050767; Fri, 23 May 2025 22:52:53 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 54NMqrsN050764; Fri, 23 May 2025 22:52:53 GMT (envelope-from git) Date: Fri, 23 May 2025 22:52:53 GMT Message-Id: <202505232252.54NMqrsN050764@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Gleb Smirnoff Subject: git: 51ac5ee0d57f - main - unix/stream: refactor sendfile(2) logic to work without M_BLOCKER flag 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: glebius X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 51ac5ee0d57f178882af4b40d36089e2069704e4 Auto-Submitted: auto-generated The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=51ac5ee0d57f178882af4b40d36089e2069704e4 commit 51ac5ee0d57f178882af4b40d36089e2069704e4 Author: Gleb Smirnoff AuthorDate: 2025-05-23 21:55:56 +0000 Commit: Gleb Smirnoff CommitDate: 2025-05-23 22:04:39 +0000 unix/stream: refactor sendfile(2) logic to work without M_BLOCKER flag This flag was initially an INVARIANT thing back in 2014, but we got stuck with it until today. A bug with sendfile(2) headers/trailers fixed as a side effect of refactoring. --- sys/kern/uipc_usrreq.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 0f730cf9424b..5b1b8443f8e6 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -1008,10 +1008,10 @@ uipc_stream_sbcheck(struct sockbuf *sb) dacc = dccc = dctl = dmbcnt = 0; STAILQ_FOREACH(d, &sb->uxst_mbq, m_stailq) { - if (d == sb->uxst_fnrdy) + if (d == sb->uxst_fnrdy) { + MPASS(d->m_flags & M_NOTREADY); notready = true; - if (notready) - MPASS(d->m_flags & (M_NOTREADY|M_BLOCKED)); + } if (d->m_type == MT_CONTROL) dctl += d->m_len; else if (d->m_type == MT_DATA) { @@ -2471,15 +2471,21 @@ uipc_sendfile(struct socket *so, int flags, struct mbuf *m, sb->sb_mbcnt += mc.mc_mlen; if (sb->uxst_fnrdy == NULL) { if (notready) { - sb->uxst_fnrdy = STAILQ_FIRST(&mc.mc_q); wakeup = false; + STAILQ_FOREACH(m, &mc.mc_q, m_stailq) { + if (m->m_flags & M_NOTREADY) { + sb->uxst_fnrdy = m; + break; + } else { + sb->sb_acc += m->m_len; + wakeup = true; + } + } } else { - sb->sb_acc += mc.mc_len; wakeup = true; + sb->sb_acc += mc.mc_len; } } else { - STAILQ_FOREACH(m, &mc.mc_q, m_stailq) - m->m_flags |= M_BLOCKED; wakeup = false; } STAILQ_CONCAT(&sb->uxst_mbq, &mc.mc_q); @@ -2504,24 +2510,22 @@ out: static int uipc_sbready(struct sockbuf *sb, struct mbuf *m, int count) { - u_int blocker; + bool blocker; /* assert locked */ - blocker = (sb->uxst_fnrdy == m) ? M_BLOCKED : 0; + blocker = (sb->uxst_fnrdy == m); STAILQ_FOREACH_FROM(m, &sb->uxst_mbq, m_stailq) { if (count > 0) { MPASS(m->m_flags & M_NOTREADY); - m->m_flags &= ~(M_NOTREADY | blocker); + m->m_flags &= ~M_NOTREADY; if (blocker) sb->sb_acc += m->m_len; count--; - } else if (blocker && !(m->m_flags & M_NOTREADY)) { - MPASS(m->m_flags & M_BLOCKED); - m->m_flags &= ~M_BLOCKED; - sb->sb_acc += m->m_len; - } else + } else if (m->m_flags & M_NOTREADY) break; + else if (blocker) + sb->sb_acc += m->m_len; } if (blocker) { sb->uxst_fnrdy = m;