Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 18 Apr 2026 20:04:48 +0000
From:      Michael Tuexen <tuexen@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: cca22c36c306 - main - iflib: fix book keeping
Message-ID:  <69e3e3e0.1de4b.27131961@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by tuexen:

URL: https://cgit.FreeBSD.org/src/commit/?id=cca22c36c306dfabe13b1d1de10e8d27ef3c3bce

commit cca22c36c306dfabe13b1d1de10e8d27ef3c3bce
Author:     Michael Tuexen <tuexen@FreeBSD.org>
AuthorDate: 2026-04-18 19:57:40 +0000
Commit:     Michael Tuexen <tuexen@FreeBSD.org>
CommitDate: 2026-04-18 19:57:40 +0000

    iflib: fix book keeping
    
    iflib_txq_drain() returns the number of consumed entries. In the case
    of TSO, a single entry can contain multiple TCP packets.
    
    Reported by:            Ricardo Branco, David Wolfskill
    Reviewed by:            gallatin
    Fixes:                  3fade68cfdf9 ("iflib: accurately count bytes/segments for TSO")
    Sponsored by:           Netflix, Inc.
    Differential Revision:  https://reviews.freebsd.org/D56509
---
 sys/net/iflib.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/sys/net/iflib.c b/sys/net/iflib.c
index 1fd8d57f4ee9..f16355ab1460 100644
--- a/sys/net/iflib.c
+++ b/sys/net/iflib.c
@@ -3866,7 +3866,7 @@ iflib_txq_drain(struct ifmp_ring *r, uint32_t cidx, uint32_t pidx)
 	if_ctx_t ctx = txq->ift_ctx;
 	if_t ifp = ctx->ifc_ifp;
 	struct mbuf *m, **mp;
-	int avail, bytes_sent, skipped, count, err, i;
+	int avail, bytes_sent, consumed, count, err, i;
 	int mcast_sent, pkt_sent, reclaimed;
 	bool do_prefetch, rang, ring;
 
@@ -3906,7 +3906,7 @@ iflib_txq_drain(struct ifmp_ring *r, uint32_t cidx, uint32_t pidx)
 	 */
 	if (reclaimed)
 		txq->ift_qstatus = IFLIB_QUEUE_IDLE;
-	skipped = mcast_sent = bytes_sent = pkt_sent = 0;
+	consumed = mcast_sent = bytes_sent = pkt_sent = 0;
 	count = MIN(avail, TX_BATCH_SIZE);
 #ifdef INVARIANTS
 	if (iflib_verbose_debug)
@@ -3929,7 +3929,7 @@ iflib_txq_drain(struct ifmp_ring *r, uint32_t cidx, uint32_t pidx)
 		 * and skip them.
 		 */
 		if (__predict_false(*mp == (struct mbuf *)txq)) {
-			skipped++;
+			consumed++;
 			continue;
 		}
 		err = iflib_encap(txq, mp, &bytes_sent, &pkt_sent);
@@ -3937,10 +3937,11 @@ iflib_txq_drain(struct ifmp_ring *r, uint32_t cidx, uint32_t pidx)
 			/* no room - bail out */
 			if (err == ENOBUFS)
 				break;
-			skipped++;
+			consumed++;
 			/* we can't send this packet - skip it */
 			continue;
 		}
+		consumed++;
 		m = *mp;
 		DBG_COUNTER_INC(tx_sent);
 		mcast_sent += !!(m->m_flags & M_MCAST);
@@ -3960,9 +3961,9 @@ iflib_txq_drain(struct ifmp_ring *r, uint32_t cidx, uint32_t pidx)
 		if_inc_counter(ifp, IFCOUNTER_OMCASTS, mcast_sent);
 #ifdef INVARIANTS
 	if (iflib_verbose_debug)
-		printf("consumed=%d\n", skipped + pkt_sent);
+		printf("consumed=%d\n", consumed);
 #endif
-	return (skipped + pkt_sent);
+	return (consumed);
 }
 
 static uint32_t


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69e3e3e0.1de4b.27131961>