From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id E483548A44 for ; Fri, 31 Oct 2025 15:36:01 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id DD66F40150; Fri, 31 Oct 2025 15:36:01 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id F26554066B for ; Fri, 31 Oct 2025 15:36:00 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1761921360; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=EdXf8psKkyT6Pdz0196C/jdePxjLd92st4M8I/sZqo4=; b=B5S8yZqHcE/jPVzaTZKutaDCPGxJxe48i/U3MYEzHfJcLMj7xsldsJlyXgyjQdD4hUFZmk RobRxt1/jESYpk+mT3I7JrOHLpisGGXhG16B4gtKi49OFQ+F3RqDYtmx1ZRnSsOeLvdRj+ OMi7+0kf/TgNuLdYvuv6J1QOGbwcSO4= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-124-dFenK51_OpmgvJDHlDs9rg-1; Fri, 31 Oct 2025 10:35:58 -0400 X-MC-Unique: dFenK51_OpmgvJDHlDs9rg-1 X-Mimecast-MFC-AGG-ID: dFenK51_OpmgvJDHlDs9rg_1761921358 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id E94051955F68; Fri, 31 Oct 2025 14:35:57 +0000 (UTC) Received: from rh.redhat.com (unknown [10.44.32.50]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 5CE641800452; Fri, 31 Oct 2025 14:35:56 +0000 (UTC) From: Kevin Traynor To: Jasper Tran O'Leary Cc: Joshua Washington , dpdk stable Subject: patch 'net/gve: free device resources on close' has been queued to stable release 24.11.4 Date: Fri, 31 Oct 2025 14:32:21 +0000 Message-ID: <20251031143421.324432-19-ktraynor@redhat.com> In-Reply-To: <20251031143421.324432-1-ktraynor@redhat.com> References: <20251031143421.324432-1-ktraynor@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: P6uO7xPwfSlatm_1bW0Zyqb0sqAn_ujBHt69Q3sqX0w_1761921358 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit content-type: text/plain; charset="US-ASCII"; x-default=true X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org 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 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 Acked-by: Joshua Washington --- 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@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