From nobody Sat Aug 8 06:31:55 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 4hHB4x67vHz6n6tm for ; Sat, 08 Aug 2026 06:32:01 +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 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hHB4x1ZKPz3kZx for ; Sat, 08 Aug 2026 06:32:01 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1786170721; 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=zD9S68jcN6p5yygQiDwLRwMIZ8HhAUixQm6qmCmaxJ8=; b=J/DTAACPRJ+UONPjPUCEGJlS3DpcxlGwS+I9DuHAriU/iacjrUMo3NAGjjngaT/mCFeDq+ kCsb98iY1yMsGEOH53Gz+fU17kJ7e0BRrjnk2Ad479hG/+xRmMf0TyKGAfxmHA3xL7u2m8 i7rlnon7iZd3q/xqeFtUKgGGqqQ0tJTyJSOsbi4UvDO3dINpjuaJ71N7NSs12PDU/WhKNK w5wjPCQTAck/lZYmGX7BzrHDdOtf13A//EXplW9hxs+GVcrIaAEXX0kW/EeO+/Fp4NfHx/ TnJkXd7nO6qB2FL3p20qgGE5DOH6Y1jlxXp5m3FU0HlGSgJW+zXjR2bvbrVohA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1786170721; a=rsa-sha256; cv=none; b=xSfQN7U1vTrVLmZgmNVN2ogt26EI3B4V/tTfor4m7a4L3A9o84qFe6Skar+FLfTC8i/y4s /F6/dNPdlcszFLNIv0Ri8+bymKER2UZtR9eJ/CMHFIGparpKov9CuckqB1BTcwDELnofZd mVLxiFtLaWUmyGt1zf+eaovbFnW0Zxj+REcuUTycqgVE9iq360xnaVDObPN0DIAv2U32Me 6fQ6u5wHZeMSQ6tsTZQd+xwVKjzCNsHMxlZ/UagQdBpwwu8i4B7qlknjkoFW3G4TDAJCl4 8rplg6r4MTZe14l7HtjqejOEzdXvenLMjpHNpTFttKs0LXel0L/qQKCx4Gcqxg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1786170721; 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=zD9S68jcN6p5yygQiDwLRwMIZ8HhAUixQm6qmCmaxJ8=; b=P7aM09O/dyJ2HyzQreuBqwnxsWTPIgnAwBzODnZAXFGtPlKabh9p1FE0Odf5XD03hGkmRP 8QNl1lPKP8VK2Vt+agR8envX5NGmTNsT3lLDc1iUspmu37yz/IrAaQ/+1O873+0ooTTS9S 99BjdtbTzBkq78a1J+ZllsnhMMZgvXCpm4mnf9lRq9v9717ajErSbh/4pwAl5eWI1l4dS7 sRs8+o/24KSaCEwQ5FwaHScr3f1TZYvr4JVawJ/bJXrXS0LpKSGeGVDA77YD+vVWL2ER1m uqJsuspQvtLyYH2J2e+UmEa+lYr3afOQ700QOOcje7DdCURLhW0m+y7lqE72xA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hHB4x0K9Sz9DZ for ; Sat, 08 Aug 2026 06:32:01 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3c92c by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 08 Aug 2026 06:31:55 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Kevin Bowling Subject: git: 65228a835267 - main - axgbe: Align channel lifetime with queue allocation List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: 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: kbowling X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 65228a835267191ba692c2699b18913a388b4d20 Auto-Submitted: auto-generated Date: Sat, 08 Aug 2026 06:31:55 +0000 Message-Id: <6a76cd5b.3c92c.1f6bd172@gitrepo.freebsd.org> The branch main has been updated by kbowling: URL: https://cgit.FreeBSD.org/src/commit/?id=65228a835267191ba692c2699b18913a388b4d20 commit 65228a835267191ba692c2699b18913a388b4d20 Author: Kevin Bowling AuthorDate: 2026-08-08 04:14:53 +0000 Commit: Kevin Bowling CommitDate: 2026-08-08 06:25:37 +0000 axgbe: Align channel lifetime with queue allocation DMA channels are allocated by attach_pre but released by queues_free. When iflib fails after attach_pre and before queue allocation, neither the old detach nor queues_free path releases them. Allocate channels with the TX queue state and make queues_free tolerate partially allocated rings. Use it to unwind allocation failures so TX rings are also released when RX allocation fails. An early detach can also precede PHY initialization and interrupt assignment. Skip absent PHY and channel state, and release the locks owned by attach_pre on both failure and detach. MFC after: 2 weeks --- sys/dev/axgbe/if_axgbe_pci.c | 79 +++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 42 deletions(-) diff --git a/sys/dev/axgbe/if_axgbe_pci.c b/sys/dev/axgbe/if_axgbe_pci.c index 6bc4bd33e162..77f6b8a056d8 100644 --- a/sys/dev/axgbe/if_axgbe_pci.c +++ b/sys/dev/axgbe/if_axgbe_pci.c @@ -549,13 +549,6 @@ axgbe_if_attach_pre(if_ctx_t ctx) /* Initialize IFLIB if_softc_ctx_t */ axgbe_init_iflib_softc_ctx(sc); - /* Alloc channels */ - if (axgbe_alloc_channels(ctx)) { - axgbe_error("Unable to allocate channel memory\n"); - ret = ENOMEM; - goto release_bus_resource; - } - TASK_INIT(&pdata->service_work, 0, xgbe_service, pdata); /* create the workqueue */ @@ -576,13 +569,16 @@ axgbe_if_attach_pre(if_ctx_t ctx) free_task_queue: taskqueue_free(pdata->dev_workqueue); - axgbe_free_channels(sc); release_bus_resource: bus_release_resources(dev, axgbe_pci_mac_spec, mac_res); free_vlans: free(pdata->active_vlans, M_AXGBE); + pdata->active_vlans = NULL; + mtx_destroy(&pdata->xpcs_lock); + mtx_destroy(&pdata->rss_mutex); + mtx_destroy(&pdata->mdio_mutex); return (ret); } /* axgbe_if_attach_pre */ @@ -1547,6 +1543,8 @@ axgbe_interrupts_free(if_ctx_t ctx) for (i = 0; i < scctx->isc_nrxqsets; i++) { channel = pdata->channel[i]; + if (channel == NULL) + continue; axgbe_printf(2, "%s: rid %d\n", __func__, channel->dma_irq_rid); irq.ii_res = channel->dma_irq_res; irq.ii_tag = channel->dma_irq_tag; @@ -1565,22 +1563,31 @@ axgbe_if_detach(if_ctx_t ctx) mac_res[0] = pdata->xgmac_res; mac_res[1] = pdata->xpcs_res; - phy_if->phy_stop(pdata); - phy_if->phy_exit(pdata); + if (pdata->phy_data != NULL) { + phy_if->phy_stop(pdata); + phy_if->phy_exit(pdata); + pdata->phy_data = NULL; + } /* Free Interrupts */ axgbe_interrupts_free(ctx); /* Free workqueues */ taskqueue_free(pdata->dev_workqueue); + pdata->dev_workqueue = NULL; /* Release bus resources */ bus_release_resources(iflib_get_dev(ctx), axgbe_pci_mac_spec, mac_res); /* Free VLAN bitmap */ free(pdata->active_vlans, M_AXGBE); + pdata->active_vlans = NULL; axgbe_sysctl_exit(pdata); + pdata->sys_op = NULL; + mtx_destroy(&pdata->xpcs_lock); + mtx_destroy(&pdata->rss_mutex); + mtx_destroy(&pdata->mdio_mutex); return (0); } /* axgbe_if_detach */ @@ -1685,7 +1692,7 @@ axgbe_if_tx_queues_alloc(if_ctx_t ctx, caddr_t *va, uint64_t *pa, int ntxqs, if_softc_ctx_t scctx = sc->scctx; struct xgbe_channel *channel; struct xgbe_ring *tx_ring; - int i, j, k; + int i, j; MPASS(scctx->isc_ntxqsets > 0); MPASS(scctx->isc_ntxqsets == ntxqsets); @@ -1693,6 +1700,10 @@ axgbe_if_tx_queues_alloc(if_ctx_t ctx, caddr_t *va, uint64_t *pa, int ntxqs, axgbe_printf(1, "%s: txqsets %d/%d txqs %d\n", __func__, scctx->isc_ntxqsets, ntxqsets, ntxqs); + if (axgbe_alloc_channels(ctx) != 0) { + axgbe_error("Unable to allocate channel memory\n"); + return (ENOMEM); + } for (i = 0 ; i < ntxqsets; i++) { @@ -1712,6 +1723,10 @@ axgbe_if_tx_queues_alloc(if_ctx_t ctx, caddr_t *va, uint64_t *pa, int ntxqs, tx_ring->rdata = (struct xgbe_ring_data*)malloc(scctx->isc_ntxd[j] * sizeof(struct xgbe_ring_data), M_AXGBE, M_NOWAIT); + if (tx_ring->rdata == NULL) { + axgbe_error("Unable to allocate TX ring data\n"); + goto tx_ring_fail; + } /* Get the virtual & physical address of hw queues */ tx_ring->rdesc = (struct xgbe_ring_desc *)va[i*ntxqs + j]; @@ -1726,21 +1741,7 @@ axgbe_if_tx_queues_alloc(if_ctx_t ctx, caddr_t *va, uint64_t *pa, int ntxqs, return (0); tx_ring_fail: - - for (j = 0; j < i ; j++) { - - channel = pdata->channel[j]; - - tx_ring = channel->tx_ring; - for (k = 0; k < ntxqs ; k++, tx_ring++) { - if (tx_ring && tx_ring->rdata) - free(tx_ring->rdata, M_AXGBE); - } - free(channel->tx_ring, M_AXGBE); - - channel->tx_ring = NULL; - } - + axgbe_if_queues_free(ctx); return (ENOMEM); } /* axgbe_if_tx_queues_alloc */ @@ -1754,7 +1755,7 @@ axgbe_if_rx_queues_alloc(if_ctx_t ctx, caddr_t *va, uint64_t *pa, int nrxqs, if_softc_ctx_t scctx = sc->scctx; struct xgbe_channel *channel; struct xgbe_ring *rx_ring; - int i, j, k; + int i, j; MPASS(scctx->isc_nrxqsets > 0); MPASS(scctx->isc_nrxqsets == nrxqsets); @@ -1785,6 +1786,10 @@ axgbe_if_rx_queues_alloc(if_ctx_t ctx, caddr_t *va, uint64_t *pa, int nrxqs, rx_ring->rdata = (struct xgbe_ring_data*)malloc(scctx->isc_nrxd[j] * sizeof(struct xgbe_ring_data), M_AXGBE, M_NOWAIT); + if (rx_ring->rdata == NULL) { + axgbe_error("Unable to allocate RX ring data\n"); + goto rx_ring_fail; + } /* Get the virtual and physical address of the hw queues */ rx_ring->rdesc = (struct xgbe_ring_desc *)va[i*nrxqs + j]; @@ -1799,21 +1804,7 @@ axgbe_if_rx_queues_alloc(if_ctx_t ctx, caddr_t *va, uint64_t *pa, int nrxqs, return (0); rx_ring_fail: - - for (j = 0 ; j < i ; j++) { - - channel = pdata->channel[j]; - - rx_ring = channel->rx_ring; - for (k = 0; k < nrxqs ; k++, rx_ring++) { - if (rx_ring && rx_ring->rdata) - free(rx_ring->rdata, M_AXGBE); - } - free(channel->rx_ring, M_AXGBE); - - channel->rx_ring = NULL; - } - + axgbe_if_queues_free(ctx); return (ENOMEM); } /* axgbe_if_rx_queues_alloc */ @@ -1833,6 +1824,8 @@ axgbe_if_queues_free(if_ctx_t ctx) for (i = 0 ; i < scctx->isc_ntxqsets; i++) { channel = pdata->channel[i]; + if (channel == NULL || channel->tx_ring == NULL) + continue; tx_ring = channel->tx_ring; for (j = 0; j < sctx->isc_ntxqs ; j++, tx_ring++) { @@ -1846,6 +1839,8 @@ axgbe_if_queues_free(if_ctx_t ctx) for (i = 0 ; i < scctx->isc_nrxqsets; i++) { channel = pdata->channel[i]; + if (channel == NULL || channel->rx_ring == NULL) + continue; rx_ring = channel->rx_ring; for (j = 0; j < sctx->isc_nrxqs ; j++, rx_ring++) {