From nobody Thu Oct 29 06:03:03 2026 X-Original-To: dev-commits-src-branches@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 4jFYYh1ttQz6xr19 for ; Thu, 29 Oct 2026 06:03:04 +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) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4jFYYg5HWqz4sFr for ; Thu, 29 Oct 2026 06:03:03 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793253783; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=hhX3bEAagGl37ulVF0TJS510EJBy5j7aN0yEuBk9CWw=; b=QCVnXZgbv7yhCFQ5xtaT3PCiN8zDqWcZiPfWfJInbduG7jNuACbiq3/YrcxByNzP0e6mjJ 5IoRvQx9OAVhv7mHDOc36uw2DuhWMqo8u5EettoOytduQcqNNbtsMwtmG49SvCpwwy5f/K itXCvjDJO8a3RpX00leH2KAUFlXrBDk3amEmOdBY4BjtFe6lKvSNmqsB9zi4rOmSMKltn9 l6QCfkK5QlObpACdrpwnK1SlcrD1+H1UGN72fU2xfJCoWH2Cm+lusIFtLHu6X8trOdEm7Q On28LRDS8sFxMVSisuD1bQ6i0idz+iqoR2An/xh1NYJJNTNXVrhVLwh2KKcdNA== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1793253783; b=nE59gqEg4xzq4GPRwkGpj8157nfUq0FJryctJYSxEBgHKj11soTJ+EJxbWd8Knjhx2Hjta qb23tylQt63lcOfRQaIPHIcNwEMNGcg3tM3jWTV6yA+ln0EaQxBs4EymtRaGkWYLbcitz7 c5h/WPp6xInf3EoYxWVRDaq55vsPbkqa2kdeRDEiNCZaI5vdZf8No7B1SyK0amBUkfSiJA 0ruZ41gQpkct39TSMR++6apMor9qkmceF/D4kB9wfHHB0aQnJhEJ7VwjEzI3V/94bxGTol 9i/vcBHuQigh52Kj8CKP52a1ChgAVlOqDSrFHsK0UvaB1lzyB1O14aeVvAykAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793253783; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=hhX3bEAagGl37ulVF0TJS510EJBy5j7aN0yEuBk9CWw=; b=lWhWhNrUiiS2daC47ew0xebZh70Sqj1yai3i1su2KzCsDPtuMqbkx8SZbIalOfjHjU15Qi cgeKeFA8afeNDLWwqL/xC6hdSLn6fzFWqBnR1tScOA28qbr7S21OW7tZxC53VpwxY2Di2H IYQcLr6TbOGlMMisU5shntybxFvZzeShNvYmwXbqdvW79/DRwK4BEaXXRryTqIMDR4bA63 QxkNv+Ts4iDE2fUMw4R3TxJ09uphhyTSn6g6fEWs7t+jPUyXeDAhxNEqGTicRs99X531kt LXJcRroDrPReYJtstJL+fsWac1OMFtcBx+oPMlnXaAXCVtHLi3Gdy4G8gLYfrA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4jFYYg4yMkzQvx for ; Thu, 29 Oct 2026 06:03:03 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3a60a by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 29 Oct 2026 06:03:03 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Cc: Andrew Gallatin From: Kevin Bowling Subject: git: 2ccc9402e130 - stable/15 - iflib: accurately count bytes/segments for TSO List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org List-Id: Commits to the stable branches of the FreeBSD src repository 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: kbowling X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: 2ccc9402e1306457374beff065b74aff200e42a6 Auto-Submitted: auto-generated Date: Thu, 29 Oct 2026 06:03:03 +0000 Message-Id: <6ae2e197.3a60a.534b1782@gitrepo.freebsd.org> The branch stable/15 has been updated by kbowling: URL: https://cgit.FreeBSD.org/src/commit/?id=2ccc9402e1306457374beff065b74aff200e42a6 commit 2ccc9402e1306457374beff065b74aff200e42a6 Author: Andrew Gallatin AuthorDate: 2026-04-17 15:45:22 +0000 Commit: Kevin Bowling CommitDate: 2026-10-29 05:28:16 +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 (cherry picked from commit 3fade68cfdf95ee0b517b5d69b270bd8da633404) --- 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 3bc762d919f0..efd3b1b154d2 100644 --- a/sys/net/iflib.c +++ b/sys/net/iflib.c @@ -3617,7 +3617,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; @@ -3802,6 +3802,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) { @@ -4057,7 +4071,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) @@ -4066,10 +4080,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))) @@ -7608,6 +7620,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)) != @@ -7615,7 +7629,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); @@ -7681,10 +7695,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 {