From nobody Mon Oct 19 01:08:03 2026 X-Original-To: dev-commits-src-main@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 4j7HTv377Cz6wqRg for ; Mon, 19 Oct 2026 01:08:03 +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 4j7HTv28pgz4XkY for ; Mon, 19 Oct 2026 01:08:03 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792372083; 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=oQkxYuUuT/Z8JxImd+sfOVG9EU/t84GIpHcJB5PrH8DXNnD13QbtGjexpxXXYUmto3GY6d LsYIOUnCbzqQqSJTO4d5PxVSjfzVxivf9AtXKz+tiN6cWewRcd/RHvrkwqm/ZXlOVyBxD2 ET6MxhDMsYj1b1BxKZm7kNzwFtjqRe6se+WZ1bSSFNHJCmHla85S8mTNMUlJ2UelNptaXI NZFQTn95mMPWAe/eKwm1BHBhFiO48Xo1t7u090dB+icRmllopZOp25YQd3Twy2QwTuYzva H5IgduP+EpVoQAeAvg9Z7kUddLJsVrkSdFxENJwHJBSOHATLf+UDq2osnwOr6A== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1792372083; b=rXwqbKPb3u8dcnR/OPqn5PwvnsaaBFkPK8cHgMq4Qcbf2SO8QZhdc0QpUdqUopvtrmylCn vZu9KP2H3B0hU2S5zZULmApgmUZ3Pt/KlCgIydAtU1nJDRCf94nWJRrZgKwOlOST5rLUXJ dQmEOGI+Ht4wNlPXJ0QtyQDqmbOTPvGCp2YPLigM/9/A7p5JpRmhe3rJnsitg6nUMI9G3g ECbQuX+zIHSxZFj6nxAB2XJQCwe023xiaWpqc1KE+xAVnDzi3zDK5n1lZxN065KP77QbtN 4umXYge9pa5jpINIRS89LIRuqgIjPzRtuu7R2soWVh3V/9IQVmf38qm2uoev6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792372083; 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=sRRtn8Vf0biaVGg3huWAxuGD/RCDgUiDDaCGHKRStv6gnZW1IiIHQgaIlSK7IHhZYFIOPu uWYMgCLrTW+ReFITlQ9WivWd+Dm6N2eAgxXbJFZ1Fa4+I0aqy/JgkRwHfh8ZQ9bNi+YrR1 U7Fxu9LkOpoi4Of7qPnAgJ/bVoILSXOy622ACZuY8dOC+YEihrN3wzNIMmYSAX0CIRxpzQ DsgBFaExImPbxgIo6VruwIjkPe3ICCHRtHITLC4/PAFQnsse8WFZowYGpkPUxmZpXj2Bx3 nH6+IUkK/SPz2Xd7W+6rXBalvYM/TulMtwG4L6As7xG6XdL7wL+a92xy0IzX4Q== 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 4j7HTv1k84z1DcH for ; Mon, 19 Oct 2026 01:08:03 +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-main X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: Commit messages for the main branch 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)