patch 'net/nbl: fix memzone leak on queue release' has been queued to stable release 25.11.1

Kevin Traynor ktraynor at redhat.com
Thu Feb 26 14:09:33 CET 2026


Hi,

FYI, your patch has been queued to stable release 25.11.1

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 03/02/26. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/kevintraynor/dpdk-stable

This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable/commit/4ca208b85b8c0377afca6de2ab9e6186e536e4e8

Thanks.

Kevin

---
>From 4ca208b85b8c0377afca6de2ab9e6186e536e4e8 Mon Sep 17 00:00:00 2001
From: Dimon Zhao <dimon.zhao at nebula-matrix.com>
Date: Mon, 26 Jan 2026 18:52:17 -0800
Subject: [PATCH] net/nbl: fix memzone leak on queue release

[ upstream commit b6fd866d91ed14a1d9f6c96fcacbf49b510072ab ]

Add memzone free calls in tx_queue_release() and rx_queue_release()
to fix memory leaks. The memzones allocated in tx_queue_setup() and
rx_queue_setup() were not being freed when queues were released.

Fixes: 5d910b2789da ("net/nbl: support queue setup and release")

Signed-off-by: Dimon Zhao <dimon.zhao at nebula-matrix.com>
---
 drivers/net/nbl/nbl_hw/nbl_resource.h |  2 ++
 drivers/net/nbl/nbl_hw/nbl_txrx.c     | 39 ++++++++++++++++-----------
 2 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/drivers/net/nbl/nbl_hw/nbl_resource.h b/drivers/net/nbl/nbl_hw/nbl_resource.h
index 1f6515f64d..469c3f5827 100644
--- a/drivers/net/nbl/nbl_hw/nbl_resource.h
+++ b/drivers/net/nbl/nbl_hw/nbl_resource.h
@@ -138,4 +138,5 @@ struct nbl_res_tx_ring {
 	struct nbl_tx_entry *tx_entry;
 	const struct rte_memzone *net_hdr_mz;
+	const struct rte_memzone *desc_mz;
 	volatile uint8_t *notify;
 	const struct rte_eth_dev *eth_dev;
@@ -179,4 +180,5 @@ struct nbl_res_rx_ring {
 	volatile struct nbl_packed_desc *desc;
 	struct nbl_rx_entry *rx_entry;
+	const struct rte_memzone *desc_mz;
 	struct rte_mempool *mempool;
 	volatile uint8_t *notify;
diff --git a/drivers/net/nbl/nbl_hw/nbl_txrx.c b/drivers/net/nbl/nbl_hw/nbl_txrx.c
index 650790b4fc..9d92ab9992 100644
--- a/drivers/net/nbl/nbl_hw/nbl_txrx.c
+++ b/drivers/net/nbl/nbl_hw/nbl_txrx.c
@@ -70,7 +70,11 @@ static void nbl_res_txrx_release_tx_ring(void *priv, u16 queue_idx)
 	struct nbl_txrx_mgt *txrx_mgt = NBL_RES_MGT_TO_TXRX_MGT(res_mgt);
 	struct nbl_res_tx_ring *tx_ring = NBL_RES_MGT_TO_TX_RING(res_mgt, queue_idx);
+
 	if (!tx_ring)
 		return;
+
 	rte_free(tx_ring->tx_entry);
+	rte_memzone_free(tx_ring->net_hdr_mz);
+	rte_memzone_free(tx_ring->desc_mz);
 	rte_free(tx_ring);
 	txrx_mgt->tx_rings[queue_idx] = NULL;
@@ -105,5 +109,5 @@ static int nbl_res_txrx_start_tx_ring(void *priv,
 	if (eth_dev->data->tx_queues[param->queue_idx] != NULL) {
 		NBL_LOG(WARNING, "re-setup an already allocated tx queue");
-		nbl_res_txrx_stop_tx_ring(priv, param->queue_idx);
+		nbl_res_txrx_release_tx_ring(priv, param->queue_idx);
 		eth_dev->data->tx_queues[param->queue_idx] = NULL;
 	}
@@ -174,4 +178,5 @@ static int nbl_res_txrx_start_tx_ring(void *priv,
 	tx_ring->desc = (struct nbl_packed_desc *)memzone->addr;
 	tx_ring->net_hdr_mz = net_hdr_mz;
+	tx_ring->desc_mz = memzone;
 	tx_ring->eth_dev = eth_dev;
 	tx_ring->dma_set_msb = common->dma_set_msb;
@@ -227,4 +232,19 @@ static void nbl_res_txrx_stop_rx_ring(void *priv, u16 queue_idx)
 }
 
+static void nbl_res_txrx_release_rx_ring(void *priv, u16 queue_idx)
+{
+	struct nbl_resource_mgt *res_mgt = (struct nbl_resource_mgt *)priv;
+	struct nbl_txrx_mgt *txrx_mgt = NBL_RES_MGT_TO_TXRX_MGT(res_mgt);
+	struct nbl_res_rx_ring *rx_ring = NBL_RES_MGT_TO_RX_RING(res_mgt, queue_idx);
+
+	if (!rx_ring)
+		return;
+
+	rte_free(rx_ring->rx_entry);
+	rte_memzone_free(rx_ring->desc_mz);
+	rte_free(rx_ring);
+	txrx_mgt->rx_rings[queue_idx] = NULL;
+}
+
 static int nbl_res_txrx_start_rx_ring(void *priv,
 				      struct nbl_start_rx_ring_param *param,
@@ -245,5 +265,5 @@ static int nbl_res_txrx_start_rx_ring(void *priv,
 	if (eth_dev->data->rx_queues[param->queue_idx] != NULL) {
 		NBL_LOG(WARNING, "re-setup an already allocated rx queue");
-		nbl_res_txrx_stop_rx_ring(priv, param->queue_idx);
+		nbl_res_txrx_release_rx_ring(priv, param->queue_idx);
 		eth_dev->data->rx_queues[param->queue_idx] = NULL;
 	}
@@ -276,4 +296,5 @@ static int nbl_res_txrx_start_rx_ring(void *priv,
 	rx_ring->product = param->product;
 	rx_ring->mempool = param->mempool;
+	rx_ring->desc_mz = memzone;
 	rx_ring->nb_desc = param->nb_desc;
 	rx_ring->queue_id = param->queue_idx;
@@ -377,18 +398,4 @@ static int nbl_res_alloc_rx_bufs(void *priv, u16 queue_idx)
 }
 
-static void nbl_res_txrx_release_rx_ring(void *priv, u16 queue_idx)
-{
-	struct nbl_resource_mgt *res_mgt = (struct nbl_resource_mgt *)priv;
-	struct nbl_txrx_mgt *txrx_mgt = NBL_RES_MGT_TO_TXRX_MGT(res_mgt);
-	struct nbl_res_rx_ring *rx_ring =
-			NBL_RES_MGT_TO_RX_RING(res_mgt, queue_idx);
-	if (!rx_ring)
-		return;
-
-	rte_free(rx_ring->rx_entry);
-	rte_free(rx_ring);
-	txrx_mgt->rx_rings[queue_idx] = NULL;
-}
-
 static void nbl_res_txrx_update_rx_ring(void *priv, u16 index)
 {
-- 
2.53.0

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2026-02-26 10:16:50.643729445 +0000
+++ 0091-net-nbl-fix-memzone-leak-on-queue-release.patch	2026-02-26 10:16:47.035459605 +0000
@@ -1 +1 @@
-From b6fd866d91ed14a1d9f6c96fcacbf49b510072ab Mon Sep 17 00:00:00 2001
+From 4ca208b85b8c0377afca6de2ab9e6186e536e4e8 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit b6fd866d91ed14a1d9f6c96fcacbf49b510072ab ]
+
@@ -11 +12,0 @@
-Cc: stable at dpdk.org



More information about the stable mailing list