From nobody Sat Aug 22 16:04:54 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 4hS27W1tCnz6q2TC for ; Sat, 22 Aug 2026 16:04:55 +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 "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hS27W10Nvz3TQK for ; Sat, 22 Aug 2026 16:04:55 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1787414695; 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=XHCDoZoQNIj9ayt4D/nxymmdA8bbLQGnEkTnTsQAY4o=; b=Xmq+l1H/N7B/ZGbBpQgV9Sy3evHZmBCn3j41eGT+8SxR1maXj9PLST1ZApdyzqCk1w/A8D sgPkJT961ETgQKCnlIFOH3d1ICF/iAsyLepHtVKlFmwu2OSs0GF6pKOlv1JmbjOpm2tAzi Lx81lgd1TW+G40CCTvAyQJZ3iBxCEAI/Z34XeyBYZ6LmsCNH0swEfDmRiUxE2wUaIESH+L fzHsdnWdkLOLiLvlcSXCEnKJs/g3QKaxfMlNSoQ3jE+zblcXZKal8+qASoDIxF2RvZoH3Q sDSeYOobPPx53Tm4QQEa6wi4JnncaoF8KpaYCW8K55NXwf8aXXh3BDWpicL+Rg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1787414695; a=rsa-sha256; cv=none; b=jzpEcMhe1EgcrZ0/kU9Kijk8sZUKe0Lgbucdh0gdM2xbKzuHx2XI1hfJGiCBfEUk4/Rn4W PRBtNtNBHkYDCVDH3TNtbLxzUHdFDRtxufSgoE76dtTpmpx1LcUHYQ7CDtW2tef042GBqY BZPBbxPFc7UXLVvDNEccDxgztAY7MDVzem5Tel30M7qnJAnbrI14RK7RlQ9juvHG2T/u0j T0MOCj7Yuu6LWFMFogjUal+IgPVQpGQIXvbM9pGwde2lmT8UqHBGmonJFTrYICkgbXsxG0 uZCHgWXn6GGhjlS1DekLJP4CyhbBL8oGt1tUaSYZmK8GM8XfdNewY3izmNMggQ== 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=1787414695; 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=XHCDoZoQNIj9ayt4D/nxymmdA8bbLQGnEkTnTsQAY4o=; b=pk4hGHB7oCEX0ptthqyUdiENSPIDmbRb2T2AefWnNgYA3h+UMkyjqCTCYA+G8Nf9HF9Kzd AavRXeoJG6AvJDEmWZLraeyeQkwH/SZjhkDfqbwhR2aBRxBay8WI8U4C93cuHEwPh035Fj /4GBIUNO48kvzDi8fcmzm41zUJDlmFrfm7t81fofRplhj++R5OUBIzAdd9TLztnlwuNFHe 5A+t0HKPbOeRsaBZSjlMA1i3AVT3fz4M29813J3AInlMPIB3FnpAWJi84N/qQHTqV/FsSA 0BGU/YxrcjsBdQq61AA3OF9/T1MQDbX9pkRHti86CTLwolgQ9U+sDbzHR8Qd0g== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hS27V6f4nzvB5 for ; Sat, 22 Aug 2026 16:04:54 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 18880 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 22 Aug 2026 16:04:54 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Justin Hibbits Subject: git: 1d445ae68446 - main - dpaa/eth: fast-path single-page TX frame build 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 List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhibbits X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 1d445ae68446771c78161a3eca35acdb04ef78ab Auto-Submitted: auto-generated Date: Sat, 22 Aug 2026 16:04:54 +0000 Message-Id: <6a89c8a6.18880.77d5ab13@gitrepo.freebsd.org> The branch main has been updated by jhibbits: URL: https://cgit.FreeBSD.org/src/commit/?id=1d445ae68446771c78161a3eca35acdb04ef78ab commit 1d445ae68446771c78161a3eca35acdb04ef78ab Author: Justin Hibbits AuthorDate: 2026-08-10 18:24:08 +0000 Commit: Justin Hibbits CommitDate: 2026-08-22 16:03:31 +0000 dpaa/eth: fast-path single-page TX frame build The TX SG-build loop in dpaa_eth_if_start_locked() walked page boundaries with PAGE_MASK arithmetic even for buffers that lived entirely within one page -- the common case, since MCLBYTES is smaller than PAGE_SIZE. Add a fast path that emits a single SGT entry for wholly-in-one-page segments and skips the inner while entirely. Fix the following bugs while we're here: 1. "if (m->m_len == 0) continue;" in the outer loop never advanced m -- any zero-length mbuf hung the TX path in an infinite loop. Fix this by switching to a for loop, with the advancement in the post-clause. 2. In the inner (page-splitting) loop, the cap "if (m->m_len < ssize) ssize = m->m_len;" compared against the mbuf's original length, not the remaining bytes. A single mbuf whose data started mid-page and ran into a second page would produce a second SGT entry with ssize > rem, over-reading past the buffer end into whatever followed in kernel memory. Fixed by tracking a local rem and capping ssize against it. 3. If the whole mbuf chain consisted of zero-length segments, the final-flag store "fi_sgt[i - 1].final = 1" wrote to index -1. Reject empty frames up front now instead. As part of this, rename the inner counter from dsize to rem for clarity instead of playing double-duty in both inner and outer loops. --- sys/dev/dpaa/dpaa_eth.c | 57 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/sys/dev/dpaa/dpaa_eth.c b/sys/dev/dpaa/dpaa_eth.c index 2fb902c4d300..e2826eb70b14 100644 --- a/sys/dev/dpaa/dpaa_eth.c +++ b/sys/dev/dpaa/dpaa_eth.c @@ -670,7 +670,7 @@ dpaa_eth_tx_add_csum(struct dpaa_eth_frame_info *fi) void dpaa_eth_if_start_locked(struct dpaa_eth_softc *sc) { - vm_size_t dsize, psize, ssize; + vm_size_t psize, ssize; struct dpaa_eth_frame_info *fi; unsigned int i; struct mbuf *m0, *m; @@ -710,44 +710,71 @@ dpaa_eth_if_start_locked(struct dpaa_eth_softc *sc) } i = 0; - m = m0; psize = 0; - dsize = 0; fi->fi_mbuf = m0; - while (m && i < DPAA_NUM_OF_SG_TABLE_ENTRY) { + for (m = m0; m != NULL && i < DPAA_NUM_OF_SG_TABLE_ENTRY; + m = m->m_next) { + vm_size_t rem; + if (m->m_len == 0) continue; - dsize = m->m_len; vaddr = (vm_offset_t)m->m_data; - while (dsize > 0 && i < DPAA_NUM_OF_SG_TABLE_ENTRY) { + rem = m->m_len; + + /* + * Fast path: the whole segment lives inside one + * page. Covers every default-cluster mbuf + * (MCLBYTES < PAGE_SIZE) and skips the split loop + * in the common case. + */ + if ((vaddr & PAGE_MASK) + rem <= PAGE_SIZE) { + fi->fi_sgt[i].addr = dpaa_eth_va_to_phys(vaddr); + fi->fi_sgt[i].length = rem; + fi->fi_sgt[i].extension = 0; + fi->fi_sgt[i].final = 0; + fi->fi_sgt[i].bpid = 0; + fi->fi_sgt[i].offset = 0; + psize += rem; + i++; + continue; + } + + /* + * Slow path: mbuf crosses at least one page + * boundary (jumbo cluster, or an unusually-offset + * external buffer). Emit one SGT entry per + * contiguous physical span. + */ + while (rem > 0 && i < DPAA_NUM_OF_SG_TABLE_ENTRY) { ssize = PAGE_SIZE - (vaddr & PAGE_MASK); - if (m->m_len < ssize) - ssize = m->m_len; + if (rem < ssize) + ssize = rem; fi->fi_sgt[i].addr = dpaa_eth_va_to_phys(vaddr); fi->fi_sgt[i].length = ssize; - fi->fi_sgt[i].extension = 0; fi->fi_sgt[i].final = 0; fi->fi_sgt[i].bpid = 0; fi->fi_sgt[i].offset = 0; - dsize -= ssize; + rem -= ssize; vaddr += ssize; psize += ssize; i++; } - if (dsize > 0) + if (rem > 0) /* SGT full mid-mbuf */ break; - - m = m->m_next; } - /* Check if SG table was constructed properly */ - if (m != NULL || dsize != 0) { + /* + * Reject the frame if we didn't consume the whole chain + * (SGT full mid-frame) or if the chain produced no SGT + * entries at all (all-zero-length mbufs). + */ + if (m != NULL || i == 0) { dpaa_eth_fi_free(sc, fi); m_freem(m0); continue;