From nobody Fri Apr 17 17:35:06 2026 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 4fy28C2Khxz6Wk3F for ; Fri, 17 Apr 2026 17:35:07 +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 4fy28B70HDz3nCF for ; Fri, 17 Apr 2026 17:35:06 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1776447307; 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=OiotUL01o6TUVbCHwqx9u0kM2RlfsxGXOQutOl197tg=; b=nCctOI4mjYhRLtN/jDo9bpq0mdB3iOpSMDXowoiW+qSATFHlRMN8gfF5dqiytt7Ch/lAxy 0Yp6p3pMpUWyTBmEN7XV+kQ3FIK13uCgQ0WaV3lGHRQDoYipAybhG60ivBFqjkkp0ZCaC3 9JuT++hw/B3CTSUuRSSmwdaQMPy+qb1vG5eaV2aYkYrwtuEb8mVnyGnw8uS/k0LMTpCoxF rLlMPmTZ9Vtncz/99SgHx91loefKpKwXTiFhZjl5s7pUHcdwd3spRIXDlQF+OCuftvXo1D WjiL52wHiNBBVZN9BskUIl4HqHG5STMYQ9t6gdREJWI9ZTJ+MDkfd1qLJruHaw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1776447307; a=rsa-sha256; cv=none; b=kpONUJr9Qr07KySl9PfQhgkIyOQhLWZzx6xLEcKSC3/pOJumhO/8KR/ZKXbe8r/LtK7ByC Gtc9C09z6pUlYToSG9uoaj3GH4Ow2LqrL7pEpZIjzBxqS9ghF07Bml84VdEHJ4ai/SRRgV rHiG66mLO2a4ARjDzrw/2qRWEquI4/cqr2eTz2gFj6MTfSIWkGulbK2Fhv+7jMjw8V6MRg 3YT0aOVsIBoh/cHkP+6R6YQzNZhepixISGLOT9MFmBXfhoHStzQMtiiGMwmi92dkE6iuB9 vK3pqkpShbmnGY6/zxcAFRju3pDNYwGZnsIgCEVyaQ66f4iKpSjZhnrlBH0u6w== 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=1776447307; 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=OiotUL01o6TUVbCHwqx9u0kM2RlfsxGXOQutOl197tg=; b=shSXipKw+UPGigfde/jVbO+KABHB6cnvDnkZqpUZvGZcIMqeNYqkGYPC4T23mu8bSysLzF pCCIquOq2aO/taFtu7o3seruh282VihvWGz13ww7hQAioKAR9jcRAsP4VglQfLFKi5fsc5 Qouigdy7CaOrmn+WUEZZbpZO9GWJ+hB5jn6y6vMy0s18+FFtAbplGSdsZGTEhxZg4JPBU3 zxJ0GuRKUBBg8daUCwoZglLkS5R5fX/WKWTzoDY6wmyrzFXg0WpXyOldcE8O4HPS8fzzzt K2+UvFQvMyOw7azeeJ+VNWW+7cEYGfJfXmL5Fn2J6o9D4Ru621GnJDb3kO+Zkg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fy28B5lSnz13s4 for ; Fri, 17 Apr 2026 17:35:06 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 346e1 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 17 Apr 2026 17:35:06 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Gallatin Subject: git: 3fade68cfdf9 - main - iflib: accurately count bytes/segments for TSO 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: gallatin X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 3fade68cfdf95ee0b517b5d69b270bd8da633404 Auto-Submitted: auto-generated Date: Fri, 17 Apr 2026 17:35:06 +0000 Message-Id: <69e26f4a.346e1.31c510c2@gitrepo.freebsd.org> The branch main has been updated by gallatin: URL: https://cgit.FreeBSD.org/src/commit/?id=3fade68cfdf95ee0b517b5d69b270bd8da633404 commit 3fade68cfdf95ee0b517b5d69b270bd8da633404 Author: Andrew Gallatin AuthorDate: 2026-04-17 15:45:22 +0000 Commit: Andrew Gallatin CommitDate: 2026-04-17 17:34:27 +0000 iflib: accurately count bytes/segments for TSO When using software based ifnet counters, iflib has not factored TSO into account when reporting the segments and bytes sent. So it will underreport NIC bandwidth by a small percent, and will undercount sent segments by a large factor. Fix this by calculating the number of added segments the NIC will send, and add header size multiplied by that number to arrive at a correct accounting of segments and bytes sent. This makes these software counters directly comparable to hardware counters. Doing this requires moving the calculation into iflib_encap() where we have already parsed the packet and know the header size, MSS, etc. Differential Revision: https://reviews.freebsd.org/D56338 Sponsored by: Netflix --- sys/net/iflib.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/sys/net/iflib.c b/sys/net/iflib.c index 085b69b62553..1fd8d57f4ee9 100644 --- a/sys/net/iflib.c +++ b/sys/net/iflib.c @@ -3478,7 +3478,7 @@ iflib_ether_pad(device_t dev, struct mbuf **m_head, uint16_t min_frame_size) } static int -iflib_encap(iflib_txq_t txq, struct mbuf **m_headp) +iflib_encap(iflib_txq_t txq, struct mbuf **m_headp, int *obytes, int *opkts) { if_ctx_t ctx; if_shared_ctx_t sctx; @@ -3663,6 +3663,20 @@ defrag: */ txq->ift_pidx = pi.ipi_new_pidx; txq->ift_npending += pi.ipi_ndescs; + + /* + * Update packets / bytes sent + */ + if (flags & IFLIB_TSO) { + int hlen = pi.ipi_ehdrlen + pi.ipi_ip_hlen + pi.ipi_tcp_hlen; + int tsolen = pi.ipi_len - hlen; + int nsegs = (tsolen + pi.ipi_tso_segsz - 1) / pi.ipi_tso_segsz; + *obytes += tsolen + nsegs * hlen; + *opkts += nsegs; + } else { + *obytes += pi.ipi_len; + *opkts += 1; + } } else { *m_headp = m_head = iflib_remove_mbuf(txq); if (err == EFBIG) { @@ -3918,7 +3932,7 @@ iflib_txq_drain(struct ifmp_ring *r, uint32_t cidx, uint32_t pidx) skipped++; continue; } - err = iflib_encap(txq, mp); + err = iflib_encap(txq, mp, &bytes_sent, &pkt_sent); if (__predict_false(err)) { /* no room - bail out */ if (err == ENOBUFS) @@ -3927,10 +3941,8 @@ iflib_txq_drain(struct ifmp_ring *r, uint32_t cidx, uint32_t pidx) /* we can't send this packet - skip it */ continue; } - pkt_sent++; m = *mp; DBG_COUNTER_INC(tx_sent); - bytes_sent += m->m_pkthdr.len; mcast_sent += !!(m->m_flags & M_MCAST); if (__predict_false(!(if_getdrvflags(ifp) & IFF_DRV_RUNNING))) @@ -7136,6 +7148,8 @@ iflib_debugnet_transmit(if_t ifp, struct mbuf *m) if_ctx_t ctx; iflib_txq_t txq; int error; + int bytes_sent = 0; + int pkt_sent = 0; ctx = if_getsoftc(ifp); if ((if_getdrvflags(ifp) & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != @@ -7143,7 +7157,7 @@ iflib_debugnet_transmit(if_t ifp, struct mbuf *m) return (EBUSY); txq = &ctx->ifc_txqs[0]; - error = iflib_encap(txq, &m); + error = iflib_encap(txq, &m, &bytes_sent, &pkt_sent); if (error == 0) (void)iflib_txd_db_check(txq, true); return (error); @@ -7209,10 +7223,8 @@ iflib_simple_transmit(if_t ifp, struct mbuf *m) txq = iflib_simple_select_queue(ctx, m); mtx_lock(&txq->ift_mtx); - error = iflib_encap(txq, &m); + error = iflib_encap(txq, &m, &bytes_sent, &pkt_sent); if (error == 0) { - pkt_sent++; - bytes_sent += m->m_pkthdr.len; mcast_sent += !!(m->m_flags & M_MCAST); (void)iflib_txd_db_check(txq, true); } else {