From nobody Wed Oct 28 20:36: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 4jFJzS4XvNz6x6Nv for ; Wed, 28 Oct 2026 20:36: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 4jFJzS0Kkbz4RTR for ; Wed, 28 Oct 2026 20:36:03 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793219764; 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=AVH/PRPAGVJ01Y53af9+6b8bHY2DCZyd+eVpBT2IFu0=; b=fyuOI+4mAdnJsKeFk26zr/If4RZbc9uFaliin86lU6vZ/J6O5/l5ZeCkqpdNadqmAR0c/x PE3CiFLe2V07UxJzByBh5PeIVgaseoc1q0EuhY+Rg9JnCkvdUiUD7mEQqQbsGajtlB6d0o YbL73Cp4vvPUrInIxWykCXGTQXui+BmX4aBHLCmWi6YQFrhcPa/F3zqHolaa3bzqKvAHPO lAXalOf16G79w7K2JiJvfvW3VDp7p9Hb/x7YC33kJMuChuQjErpHIhAMfJOEn9dKpJsfgW rLr2di03iWzxHIm+zu0qbrP4TrTw99ucoGR6xT4gVF9RapgYekTpLLMd0TcFsw== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1793219764; b=Sd1Zu3grQzMPK+ocNLq+mv+oQYpiI33weVkZBen/Oa0TOqB/EsfurwovsNlSrJGxIzoaNP omfS70B12o9niTf45FpyZbMUSdmewhgVs4CG9lL/r3F8KMaONNembr9tCf1xMl2z6S4ZEW WPuD4YICYTL7jCAodYm6JxLIR566+cfgRt0NPY47McNVFhbwwprsKTh4bert5NA1UyaQcW Ace+7JAcdY0S5lZ/iyPkgF+Ugj+RoG64DjHh9K2NcDkK7kHM74rzoYYVvlsTZtkNvSr1+c /dOTHe7v8ph95SpFhHSuGNaBPQ6m17k7blk65o3VrTUlcuIHIspY4URiQQulLg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793219764; 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=AVH/PRPAGVJ01Y53af9+6b8bHY2DCZyd+eVpBT2IFu0=; b=exsckwAqQP9UDq27M6qMBrZssNYYfty6Wvb7NgpFI6Iho/0EfTYyb+aW865vMxoBXPj9Pa vRABDtNB0a3gsLvqGSWtbhRRrqPRdoNG1K8YhUBA/Vlps8nbpoeXIXYcgUxNJsJcQVoZj3 5pz/BN/b/Y3H0WBiDMHy1Fy4HKXhGrmA1kjj2TuvJult75ZKvxcTSbEjezxPhwA8sCwoY3 5qJDIlvOStCnOx1i01D4ODCTaGBY9Ncba3ZFPkNMEXkoOGgv6/pru5vzP82lqjmI3dYVuS ACpgN8l0lhDL+EQcOOq6RKd34fVM1gCV/y871DyQPhn2lah6UVCIHECX5BU9Lg== 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 4jFJzR69Klz1MkG for ; Wed, 28 Oct 2026 20:36:03 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1c4f9 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 28 Oct 2026 20:36:03 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: R. Christian McDonald Subject: git: 84aa3cb3204d - stable/15 - iflib: Pass up the frames received before a descriptor error 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: rcm X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: 84aa3cb3204df2e5f7c51ae799d8d4dad79cb01f Auto-Submitted: auto-generated Date: Wed, 28 Oct 2026 20:36:03 +0000 Message-Id: <6ae25cb3.1c4f9.5bde3474@gitrepo.freebsd.org> The branch stable/15 has been updated by rcm: URL: https://cgit.FreeBSD.org/src/commit/?id=84aa3cb3204df2e5f7c51ae799d8d4dad79cb01f commit 84aa3cb3204df2e5f7c51ae799d8d4dad79cb01f Author: R. Christian McDonald AuthorDate: 2026-10-19 01:06:41 +0000 Commit: R. Christian McDonald CommitDate: 2026-10-28 20:34:19 +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 (cherry picked from commit bdaddb76ef1b9d5537f4a76cff01cdb4795804a4) --- 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 c0085156e385..850e966bd3b9 100644 --- a/sys/net/iflib.c +++ b/sys/net/iflib.c @@ -2892,6 +2892,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 @@ -2907,6 +2908,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) @@ -2941,9 +2943,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; @@ -2990,8 +2992,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); @@ -3007,15 +3011,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)