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 C8F9B4704A for ; Mon, 29 Dec 2025 21:53:41 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C03A740612; Mon, 29 Dec 2025 21:53:41 +0100 (CET) Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) by mails.dpdk.org (Postfix) with ESMTP id F297240612 for ; Mon, 29 Dec 2025 21:53:40 +0100 (CET) Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-34c6e05af3bso20941402a91.3 for ; Mon, 29 Dec 2025 12:53:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1767041620; x=1767646420; darn=dpdk.org; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=PnKNpYz/n39JgKQjcItTLdFGQAvCkms8QJc1K4Wj2Sc=; b=cv3aW+q8X8WWSsJoxFcm42rK5gg6yYB4T4hIyooNSPoD9YStkOG7lqgyxlDWwmZKCC x6loSXqy8VUoKddH4SWp4iAO4OnFS4MJe4jVaziWpLA7ZlgHWpfHDP4yBKauCpSoesLX jH9SiDTSEtRm0Z6ct6ORI5yK6kLdqwPRmAfSAorKkF4zKGiKxTykMox+Yjhg3M1UOEJd 5ihBdng2IAMp7SmB1AsyagVPmqUGc04gy4SRjSmDxIwoyZ97uILb5IvfjlLjSVPxRfaL 3INNrZOeJU+gxQoDTy+qoL5189tgpf7VH2MAtEepn3U7euQsNF0oXup22eA1oO93An4b TGjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767041620; x=1767646420; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=PnKNpYz/n39JgKQjcItTLdFGQAvCkms8QJc1K4Wj2Sc=; b=CjcqD5D3Pra6HwbbNNhqD3JnsCVLeZJB67hdPiMcHq3nAf6tH3A0VF3xyfaP03LWaF qUAEo1jopghOwj4zrHT2IAeMJIwBDARoYWQ9LM4Y2y6tnfmHVY0GA2WF8yla5+rgRmaO 4Lk1RsdRS6vmh+qRlkdv+cJgiokJCEVdFY8EKnaQMUweiGSp5iLlfyAGSqBhumgwc3GW U9XV2Hm/HZO+0liOnFd2tAgY+pI2kFxTXFfqBTSuRMyH9UJ8x/pa4OlJO/5nlv0yx0qw 1VaBs179YmWxcjjU8tlfs8pUi4uDTLibM3R2NwsgT9/UlmQhTvcGSCLMfnKHd4wBzx49 IHBA== X-Gm-Message-State: AOJu0Yyp8BvI2CFWhzzsXCa6MF/DgqC+1lbAFZ/v9RmagkIjoL6vbFok DPCH8TbWSuJIfV9CRUbkHz7f69M1G2cK9y8lx5+SsJKZmqRpZpCnCZTHd0ygWPBgVQHo/Qvu3Wj Nq/AE4rISOE1Bm76vanchIWhcwQatep77hYumRNMLHguIZY0VCa7BwEx8MPjXe6L2shMwKr73ah Fg8KP8G3o3T4wGYPzhjbGC4hgaQ6DycqmRUygakfl25X6zl9Wu/ZxNmw== X-Google-Smtp-Source: AGHT+IEfpPyAZ310plL5mLAXYs00Dqb96wJn4rtNXAy9EPk9nczxb7yFtc/vP0lDo3iwxFQVsNlplISHPveZzZD0Iw== X-Received: from pjtu7.prod.google.com ([2002:a17:90a:c887:b0:34c:1d9b:2526]) (user=jtranoleary job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1e42:b0:341:6164:c27d with SMTP id 98e67ed59e1d1-34e92137f6fmr24973444a91.3.1767041619770; Mon, 29 Dec 2025 12:53:39 -0800 (PST) Date: Mon, 29 Dec 2025 20:53:38 +0000 Mime-Version: 1.0 X-Mailer: git-send-email 2.52.0.351.gbe84eed79e-goog Message-ID: <20251229205338.3762698-1-jtranoleary@google.com> Subject: [PATCH 23.11] net/gve: free device resources on close From: "Jasper Tran O'Leary" To: stable@dpdk.org Cc: "Jasper Tran O'Leary" Content-Type: text/plain; charset="UTF-8" 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 [ 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 | 125 +++++++++++++++--------------- 2 files changed, 63 insertions(+), 64 deletions(-) diff --git a/drivers/net/gve/base/gve_adminq.c b/drivers/net/gve/base/gve_adminq.c index 438c0c5441..500557d32e 100644 --- a/drivers/net/gve/base/gve_adminq.c +++ b/drivers/net/gve/base/gve_adminq.c @@ -214,8 +214,6 @@ void gve_adminq_release(struct gve_priv *priv) i++; 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 c0df116b1b..ad1e3a6caa 100644 --- a/drivers/net/gve/gve_ethdev.c +++ b/drivers/net/gve/gve_ethdev.c @@ -259,6 +259,8 @@ gve_start_queues(struct rte_eth_dev *dev) } } + gve_set_device_rings_ok(priv); + return 0; err_rx: @@ -271,6 +273,8 @@ gve_start_queues(struct rte_eth_dev *dev) gve_stop_tx_queues(dev); else gve_stop_tx_queues_dqo(dev); + + gve_clear_device_rings_ok(priv); return ret; } @@ -295,8 +299,11 @@ static int gve_dev_stop(struct rte_eth_dev *dev) { struct gve_priv *priv = dev->data->dev_private; + + 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); @@ -305,24 +312,15 @@ gve_dev_stop(struct rte_eth_dev *dev) gve_stop_rx_queues_dqo(dev); } - dev->data->dev_started = 0; - return 0; } -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++) gve_tx_queue_release(dev, i); @@ -336,9 +334,58 @@ gve_dev_close(struct rte_eth_dev *dev) for (i = 0; i < dev->data->nb_rx_queues; i++) gve_rx_queue_release_dqo(dev, i); } +} + +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); + } + + 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_free_qpls(priv); - rte_free(priv->adminq); + gve_teardown_device_resources(priv); + gve_adminq_free(priv); dev->data->mac_addrs = NULL; @@ -692,36 +739,6 @@ static const struct eth_dev_ops gve_eth_dev_ops_dqo = { .xstats_get_names = gve_xstats_get_names, }; -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); - } - 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) { @@ -776,6 +793,9 @@ gve_setup_device_resources(struct gve_priv *priv) PMD_DRV_LOG(ERR, "Could not config device resources: err=%d", err); goto free_irq_dbs; } + + gve_set_device_resources_ok(priv); + return 0; free_irq_dbs: @@ -891,13 +911,6 @@ gve_init_priv(struct gve_priv *priv, bool skip_describe_device) return err; } -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) { @@ -957,18 +970,6 @@ gve_dev_init(struct rte_eth_dev *eth_dev) return 0; } -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, struct rte_pci_device *pci_dev) @@ -979,7 +980,7 @@ gve_pci_probe(__rte_unused struct rte_pci_driver *pci_drv, 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); } static const struct rte_pci_id pci_id_gve_map[] = { -- 2.47.3