From nobody Mon Oct 19 01:08:03 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 4j7HV04fsgz6wqKf for ; Mon, 19 Oct 2026 01:08:08 +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 4j7HV02S6zz4Xky for ; Mon, 19 Oct 2026 01:08:08 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792372088; 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=Vst0NC9a4kbgC1zgOyaJDJYiZ4EQ/zbjFx+3WW0I/ZQ=; b=NsKKWRQ+QMWTmXy53to/fuLodjpFNwuMojzyYM3tm/brHn1k9jSvph9V5t3K5GKCRsTrTI +5cEk23YVLCumYwXXysbD8zabemgEYNmDLRInllxBAnXNUMSRbWqIPSZdqsSOvTr9uczXz IAq7ZksQpENqAOQxTeTogc+pN1BKdqBWqA2d1Vx+Ouh6CQiHdOO25Mx7c8bO3awvhhl4ef XcsatGHralK1HmwiMpHJgZJ/78aujeJ+EBFFw6MgtPrquDIbzLyv2xCaWEuDeBsFGqB91V zEtwBoEJ9g2ephsccUOtSRNV6zj8K+LB3Kjrf1qXQkDTBB3/7qQph/zyrsL9Uw== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1792372088; b=N6cJOu56keSWU39S2aBUM2cqF51D5M7L9bxXxCA1ug5mFGKPU1RTZPTI2wf+ZPvh/kIMko 52S7Evfz90BF99Bpa99XxvKM49cNaXQIVg64EfJyT0a0BfkkOSAMEegPV6NAGEAkQsGCOJ LTFY/ujpDEFIDg4sOeZtJA/eREKephBS9Ar2Hu6VzBwsoa3z0AY184rg7I6VuTxyp3+zq2 01GsYK/S2fZNgXvlTSIWzy/jJ8avPxOP6x3b3MX6wMu3gtric4xK1c1/G7KOEkGgxWwzcm QHZcdXVJIYtQpbdzGUJvT+ltH5uHQmEJtV9YESP0/RFvM9FKzr0u2EXIWPI0aA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792372088; 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=Vst0NC9a4kbgC1zgOyaJDJYiZ4EQ/zbjFx+3WW0I/ZQ=; b=oDLX7Cls6XVgu/C9uzd4KSdcQVCn2J46z5uXDVtRczRn1lwB307S8SZF/e97j4k8lIQiXu Pcx2Q41y6HR73vBp59LET9DUaNJ9H/MTgTFGw3qwrZCo/elPKrqopflEMQfOSDTcnblvnE y06tALlgG36zTOfsg6ni66KdupLxp/gGk7B9JJvTE1L3G2vK0WAogwvcfLMyXppEYPzEz+ 0IWP5JGBdLFoDWNCjASk2nEjo5kK+rdj/ooR5nngpAK2XzaJ4QFfEypMHX/VeDdnQLSpIb nueCqUbstzkdeZfEcrHb8bmMHymiqqfLicrOTa+sSeYTQV6GAmkNoJm5sHcNrA== 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 4j7HV01rvQz1Cld for ; Mon, 19 Oct 2026 01:08:08 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 277c9 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 19 Oct 2026 01:08:03 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: R. Christian McDonald Subject: git: bdaddb76ef1b - main - iflib: Pass up the frames received before a descriptor error List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: Commit messages for all branches of the 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: rcm X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: bdaddb76ef1b9d5537f4a76cff01cdb4795804a4 Auto-Submitted: auto-generated Date: Mon, 19 Oct 2026 01:08:03 +0000 Message-Id: <6ad56d73.277c9.5b946ae2@gitrepo.freebsd.org> The branch main has been updated by rcm: URL: https://cgit.FreeBSD.org/src/commit/?id=bdaddb76ef1b9d5537f4a76cff01cdb4795804a4 commit bdaddb76ef1b9d5537f4a76cff01cdb4795804a4 Author: R. Christian McDonald AuthorDate: 2026-10-19 01:06:41 +0000 Commit: R. Christian McDonald CommitDate: 2026-10-19 01:06:41 +0000 iflib: Pass up the frames received before a descriptor error When the driver's isc_rxd_pkt_get() fails part way through a receive pass, iflib_rxeof() jumps straight to the reset request. The frames it already took off the ring and chained for if_input() are neither passed up nor freed, so up to budget - 1 frames are lost and their mbufs and clusters leak on every such error, and the frames queued to LRO in the pass wait for the next one. Leave the loop instead, pass the chain up and flush LRO as on the normal exit, then request the reset as before, without refilling. The path is reachable from several drivers: igc, em, igb and ixgbe return EBADMSG for frames received with errors, which the hardware passes up only with store-bad-packets enabled; ixl, iavf and ice for every descriptor flagged RXE; aq, enetc, mgb and enic for descriptors they cannot use. Reviewed by: gallatin Sponsored by: Rubicon Communications, LLC ("Netgate") Differential Revision: https://reviews.freebsd.org/D60805 --- sys/net/iflib.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/sys/net/iflib.c b/sys/net/iflib.c index 9ca08eaee6e8..d47c108292ae 100644 --- a/sys/net/iflib.c +++ b/sys/net/iflib.c @@ -3274,6 +3274,7 @@ iflib_rxeof(iflib_rxq_t rxq, qidx_t budget) struct if_rxd_info ri; int err, budget_left, rx_bytes, rx_pkts; iflib_fl_t fl; + bool rx_err; #if defined(INET6) || defined(INET) int lro_enabled; #endif @@ -3289,6 +3290,7 @@ iflib_rxeof(iflib_rxq_t rxq, qidx_t budget) ifp = ctx->ifc_ifp; mh = mt = NULL; + rx_err = false; MPASS(budget > 0); rx_pkts = rx_bytes = 0; if (sctx->isc_flags & IFLIB_HAS_RXCQ) @@ -3323,9 +3325,9 @@ iflib_rxeof(iflib_rxq_t rxq, qidx_t budget) ri.iri_frags = rxq->ifr_frags; err = ctx->isc_rxd_pkt_get(ctx->ifc_softc, &ri); - if (err) { - CURVNET_RESTORE(); - goto err; + if (__predict_false(err != 0)) { + rx_err = true; + break; } rx_pkts += 1; rx_bytes += ri.iri_len; @@ -3372,8 +3374,10 @@ iflib_rxeof(iflib_rxq_t rxq, qidx_t budget) } CURVNET_RESTORE(); /* make sure that we can refill faster than drain */ - for (i = 0, fl = &rxq->ifr_fl[0]; i < sctx->isc_nfl; i++, fl++) - retval |= iflib_fl_refill_all(ctx, fl); + if (__predict_true(!rx_err)) { + for (i = 0, fl = &rxq->ifr_fl[0]; i < sctx->isc_nfl; i++, fl++) + retval |= iflib_fl_refill_all(ctx, fl); + } if (mh != NULL) { if_input(ifp, mh); @@ -3389,15 +3393,16 @@ iflib_rxeof(iflib_rxq_t rxq, qidx_t budget) #if defined(INET6) || defined(INET) tcp_lro_flush_all(&rxq->ifr_lc); #endif + if (__predict_false(rx_err)) { + STATE_LOCK(ctx); + ctx->ifc_flags |= IFC_DO_RESET; + iflib_admin_intr_deferred(ctx); + STATE_UNLOCK(ctx); + return (0); + } if (avail != 0 || iflib_rxd_avail(ctx, rxq, *cidxp, 1) != 0) retval |= IFLIB_RXEOF_MORE; return (retval); -err: - STATE_LOCK(ctx); - ctx->ifc_flags |= IFC_DO_RESET; - iflib_admin_intr_deferred(ctx); - STATE_UNLOCK(ctx); - return (0); } #define TXD_NOTIFY_COUNT(txq) (((txq)->ift_size / (txq)->ift_update_freq) - 1)