git: 2f533ca9b758 - stable/15 - iflib: fix book keeping

From: Kevin Bowling <kbowling_at_FreeBSD.org>
Date: Thu, 29 Oct 2026 06:03:04 UTC
The branch stable/15 has been updated by kbowling:

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

commit 2f533ca9b7588710ac69d1408d9b2541ccfe0443
Author:     Michael Tuexen <tuexen@FreeBSD.org>
AuthorDate: 2026-04-18 19:57:40 +0000
Commit:     Kevin Bowling <kbowling@FreeBSD.org>
CommitDate: 2026-10-29 05:28:16 +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
    
    (cherry picked from commit cca22c36c306dfabe13b1d1de10e8d27ef3c3bce)
---
 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 efd3b1b154d2..3f7b1b84b514 100644
--- a/sys/net/iflib.c
+++ b/sys/net/iflib.c
@@ -4005,7 +4005,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;
 
@@ -4045,7 +4045,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)
@@ -4068,7 +4068,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);
@@ -4076,10 +4076,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);
@@ -4099,9 +4100,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