git: cca22c36c306 - main - iflib: fix book keeping
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 18 Apr 2026 20:04:48 UTC
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