patch 'net/gve: free device resources on close' has been queued to stable release 24.11.4

Kevin Traynor ktraynor at redhat.com
Fri Oct 31 15:32:21 CET 2025


Hi,

FYI, your patch has been queued to stable release 24.11.4

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 11/05/25. 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/9e2ebcbd8d586111fae989c1d8f0757b62ff5776

Thanks.

Kevin

---
>From 9e2ebcbd8d586111fae989c1d8f0757b62ff5776 Mon Sep 17 00:00:00 2001
From: Jasper Tran O'Leary <jtranoleary at google.com>
Date: Fri, 18 Jul 2025 18:27:25 +0000
Subject: [PATCH] net/gve: free device resources on close

[ upstream commit 7ba84453bacf7a8709f2aaf341e1d0b42d49a4c8 ]

Previously, upon a device close, the driver would only stop its queues,
whereas a device remove would cause the driver to free its resources.
However, expected behavior in DPDK is to have a device close free all of
its resources because ports are not reused.

This patch adds all device teardown functionality within the device
close function. It also flattens and refactors steps related to freeing
device resources such that gve_dev_close reads more linearly.

Fixes: 457967cd2b2d ("net/gve: support device initialization")

Signed-off-by: Jasper Tran O'Leary <jtranoleary at google.com>
Acked-by: Joshua Washington <joshwash at google.com>
---
 drivers/net/gve/base/gve_adminq.c |   2 -
 drivers/net/gve/gve_ethdev.c      | 153 +++++++++++++++---------------
 2 files changed, 79 insertions(+), 76 deletions(-)

diff --git a/drivers/net/gve/base/gve_adminq.c b/drivers/net/gve/base/gve_adminq.c
index bcb983e4a0..2e9636c83c 100644
--- a/drivers/net/gve/base/gve_adminq.c
+++ b/drivers/net/gve/base/gve_adminq.c
@@ -245,6 +245,4 @@ void gve_adminq_release(struct gve_priv *priv)
 		msleep(GVE_ADMINQ_SLEEP_LEN);
 	}
-	gve_clear_device_rings_ok(priv);
-	gve_clear_device_resources_ok(priv);
 	gve_clear_admin_queue_ok(priv);
 }
diff --git a/drivers/net/gve/gve_ethdev.c b/drivers/net/gve/gve_ethdev.c
index 82fde360b1..ff1940abd3 100644
--- a/drivers/net/gve/gve_ethdev.c
+++ b/drivers/net/gve/gve_ethdev.c
@@ -384,4 +384,6 @@ gve_start_queues(struct rte_eth_dev *dev)
 	}
 
+	gve_set_device_rings_ok(priv);
+
 	return 0;
 
@@ -396,4 +398,6 @@ err_tx:
 	else
 		gve_stop_tx_queues_dqo(dev);
+
+	gve_clear_device_rings_ok(priv);
 	return ret;
 }
@@ -441,15 +445,16 @@ gve_dev_stop(struct rte_eth_dev *dev)
 {
 	struct gve_priv *priv = dev->data->dev_private;
-	dev->data->dev_link.link_status = RTE_ETH_LINK_DOWN;
-
-	if (gve_is_gqi(priv)) {
-		gve_stop_tx_queues(dev);
-		gve_stop_rx_queues(dev);
-	} else {
-		gve_stop_tx_queues_dqo(dev);
-		gve_stop_rx_queues_dqo(dev);
-	}
 
 	dev->data->dev_started = 0;
+	dev->data->dev_link.link_status = RTE_ETH_LINK_DOWN;
+
+	gve_clear_device_rings_ok(priv);
+	if (gve_is_gqi(priv)) {
+		gve_stop_tx_queues(dev);
+		gve_stop_rx_queues(dev);
+	} else {
+		gve_stop_tx_queues_dqo(dev);
+		gve_stop_rx_queues_dqo(dev);
+	}
 
 	if (gve_is_gqi(dev->data->dev_private))
@@ -459,17 +464,10 @@ gve_dev_stop(struct rte_eth_dev *dev)
 }
 
-static int
-gve_dev_close(struct rte_eth_dev *dev)
+static void
+gve_free_queues(struct rte_eth_dev *dev)
 {
 	struct gve_priv *priv = dev->data->dev_private;
-	int err = 0;
 	uint16_t i;
 
-	if (dev->data->dev_started) {
-		err = gve_dev_stop(dev);
-		if (err != 0)
-			PMD_DRV_LOG(ERR, "Failed to stop dev.");
-	}
-
 	if (gve_is_gqi(priv)) {
 		for (i = 0; i < dev->data->nb_tx_queues; i++)
@@ -485,6 +483,65 @@ gve_dev_close(struct rte_eth_dev *dev)
 			gve_rx_queue_release_dqo(dev, i);
 	}
+}
 
-	rte_free(priv->adminq);
+static void
+gve_free_counter_array(struct gve_priv *priv)
+{
+	rte_memzone_free(priv->cnt_array_mz);
+	priv->cnt_array = NULL;
+}
+
+static void
+gve_free_irq_db(struct gve_priv *priv)
+{
+	rte_memzone_free(priv->irq_dbs_mz);
+	priv->irq_dbs = NULL;
+}
+
+static void
+gve_free_ptype_lut_dqo(struct gve_priv *priv)
+{
+	if (!gve_is_gqi(priv)) {
+		rte_free(priv->ptype_lut_dqo);
+		priv->ptype_lut_dqo = NULL;
+	}
+}
+
+static void
+gve_teardown_device_resources(struct gve_priv *priv)
+{
+	int err;
+
+	/* Tell device its resources are being freed */
+	if (gve_get_device_resources_ok(priv)) {
+		err = gve_adminq_deconfigure_device_resources(priv);
+		if (err)
+			PMD_DRV_LOG(ERR, "Could not deconfigure device resources: err=%d", err);
+	}
+
+	gve_free_ptype_lut_dqo(priv);
+	gve_free_counter_array(priv);
+	gve_free_irq_db(priv);
+	gve_clear_device_resources_ok(priv);
+}
+
+static int
+gve_dev_close(struct rte_eth_dev *dev)
+{
+	struct gve_priv *priv = dev->data->dev_private;
+	int err = 0;
+
+	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+		return 0;
+
+	if (dev->data->dev_started) {
+		err = gve_dev_stop(dev);
+		if (err != 0)
+			PMD_DRV_LOG(ERR, "Failed to stop dev.");
+	}
+
+	gve_free_queues(dev);
+	gve_teardown_device_resources(priv);
+	gve_adminq_free(priv);
 
 	dev->data->mac_addrs = NULL;
@@ -1057,39 +1114,4 @@ static const struct eth_dev_ops gve_eth_dev_ops_dqo = {
 };
 
-static void
-gve_free_counter_array(struct gve_priv *priv)
-{
-	rte_memzone_free(priv->cnt_array_mz);
-	priv->cnt_array = NULL;
-}
-
-static void
-gve_free_irq_db(struct gve_priv *priv)
-{
-	rte_memzone_free(priv->irq_dbs_mz);
-	priv->irq_dbs = NULL;
-}
-
-static void
-gve_teardown_device_resources(struct gve_priv *priv)
-{
-	int err;
-
-	/* Tell device its resources are being freed */
-	if (gve_get_device_resources_ok(priv)) {
-		err = gve_adminq_deconfigure_device_resources(priv);
-		if (err)
-			PMD_DRV_LOG(ERR, "Could not deconfigure device resources: err=%d", err);
-	}
-
-	if (!gve_is_gqi(priv)) {
-		rte_free(priv->ptype_lut_dqo);
-		priv->ptype_lut_dqo = NULL;
-	}
-	gve_free_counter_array(priv);
-	gve_free_irq_db(priv);
-	gve_clear_device_resources_ok(priv);
-}
-
 static int
 pci_dev_msix_vec_count(struct rte_pci_device *pdev)
@@ -1161,4 +1183,6 @@ gve_setup_device_resources(struct gve_priv *priv)
 	}
 
+	gve_set_device_resources_ok(priv);
+
 	return 0;
 free_ptype_lut:
@@ -1253,11 +1277,4 @@ free_adminq:
 }
 
-static void
-gve_teardown_priv_resources(struct gve_priv *priv)
-{
-	gve_teardown_device_resources(priv);
-	gve_adminq_free(priv);
-}
-
 static int
 gve_dev_init(struct rte_eth_dev *eth_dev)
@@ -1329,16 +1346,4 @@ gve_dev_init(struct rte_eth_dev *eth_dev)
 }
 
-static int
-gve_dev_uninit(struct rte_eth_dev *eth_dev)
-{
-	struct gve_priv *priv = eth_dev->data->dev_private;
-
-	gve_teardown_priv_resources(priv);
-
-	eth_dev->data->mac_addrs = NULL;
-
-	return 0;
-}
-
 static int
 gve_pci_probe(__rte_unused struct rte_pci_driver *pci_drv,
@@ -1351,5 +1356,5 @@ static int
 gve_pci_remove(struct rte_pci_device *pci_dev)
 {
-	return rte_eth_dev_pci_generic_remove(pci_dev, gve_dev_uninit);
+	return rte_eth_dev_pci_generic_remove(pci_dev, gve_dev_close);
 }
 
-- 
2.51.0

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2025-10-31 13:53:52.860809491 +0000
+++ 0019-net-gve-free-device-resources-on-close.patch	2025-10-31 13:53:52.038523374 +0000
@@ -1 +1 @@
-From 7ba84453bacf7a8709f2aaf341e1d0b42d49a4c8 Mon Sep 17 00:00:00 2001
+From 9e2ebcbd8d586111fae989c1d8f0757b62ff5776 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 7ba84453bacf7a8709f2aaf341e1d0b42d49a4c8 ]
+
@@ -16 +17,0 @@
-Cc: stable at dpdk.org
@@ -26 +27 @@
-index 25f4481c1b..b1fe33080a 100644
+index bcb983e4a0..2e9636c83c 100644
@@ -29,2 +30,2 @@
-@@ -277,6 +277,4 @@ void gve_adminq_release(struct gve_priv *priv)
- 		}
+@@ -245,6 +245,4 @@ void gve_adminq_release(struct gve_priv *priv)
+ 		msleep(GVE_ADMINQ_SLEEP_LEN);
@@ -37 +38 @@
-index ef1c543aac..56e1a470b8 100644
+index 82fde360b1..ff1940abd3 100644



More information about the stable mailing list