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 314A346BAE for ; Fri, 18 Jul 2025 20:22:23 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2C1B340E22; Fri, 18 Jul 2025 20:22:23 +0200 (CEST) Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) by mails.dpdk.org (Postfix) with ESMTP id 5E7F340E22 for ; Fri, 18 Jul 2025 20:22:21 +0200 (CEST) Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-b31ca4b6a8eso1645452a12.1 for ; Fri, 18 Jul 2025 11:22:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1752862940; x=1753467740; darn=dpdk.org; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=FYdBXXl1KZbBiQL/IDgq+Ntbd11p5uq+47X8jjsHF7g=; b=bCkupSjSR8UJ23rgen18a9HDldsja2CvgRZJyK19R3x5UbZK7d/SOSdX8hB1aQO6ej RSSew+guwTqHFQ83me6YdTtYNT77pAJVaXdNV/UiW6C2COt/eZw9m/fd1n2+Qe9mcaRW T770KEX5fFpZur785Y4jQebKVOc5YV5uLkTZ3wTZmjCpRMThrpsaHZ+vpEUJMKdXrvGr HzugYEXITWPWzLG+gPR6moEi8Epd6gfwVGqD752/iuutAoGchLBvDK5qwOPNkt1JnfLa YS/B4YFdR8IUNyb4L3Gx0pga0uiYZwAiPakszEOmPnH5e5JgREIS9CxtYIdAnbDyDOxJ Mx1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752862940; x=1753467740; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=FYdBXXl1KZbBiQL/IDgq+Ntbd11p5uq+47X8jjsHF7g=; b=M0V0UNsrPWI2ZGWrPKqd9eCLd8uWZK1GA61sa2PGDXZXs3k+RURLUlwisyKsCwVfX5 bnBoIiggsBR0XTMbXES1kCdkn/C2K7x5LVC/C0oLsZnnClJhhzROAhB4SxvsBFYtdLFL KBqvcLNn4IlJXnirFVUvuPcZw2skWcpS+yy9ps8sNit6YjxrWVpR18PdqFwdaHLdmIii 1hBnBICSsbgb6NwSYIfQ4CoXu3v4VQCqoGaX0jIFgDBgtKgUUTS7ykl7kv9h557YgHxh qxe7crK2jYK+V21oKVAR2Na3n5P5fd6FeIg1gEi42x8v3LWxtw2KytpPeVsfFnR8xFxt gBLQ== X-Gm-Message-State: AOJu0YxZ9mPcgdCzR+TBWLVRhTRn1CPAAh/dq0Ir1z0FhNUS+DmnTILd xC0lu03YZSgCYVJ5P9jUXc2nudGh7zl+kvV8hJHIFbonZxbLJAzGTEOOz9BrTOdxaG/BI36PA8W Bh9sgigibGCLHIB+Drc8ar0Xcog== X-Google-Smtp-Source: AGHT+IEFm5v+s/3HvNOM7QkRR9wPULgZVx8g/9bppggtiB3HSgOU1HozmLSiln0g4XpJKIVJdV5QbYCs6/Liqp7A6g== X-Received: from pfbml1.prod.google.com ([2002:a05:6a00:3d81:b0:746:301b:10ca]) (user=jtranoleary job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:9381:b0:232:e727:bec7 with SMTP id adf61e73a8af0-2391ca91582mr6704837637.41.1752862940415; Fri, 18 Jul 2025 11:22:20 -0700 (PDT) Date: Fri, 18 Jul 2025 18:22:16 +0000 Mime-Version: 1.0 X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250718182216.466040-1-jtranoleary@google.com> Subject: [PATCH] net/gve: free device resources in gve_dev_close From: "Jasper Tran O'Leary" To: jtranoleary@google.com Cc: stable@dpdk.org, Joshua Washington 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 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") Cc: stable@dpdk.org 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 | 139 +++++++++++++++++++++-------------------- 2 files changed, 72 insertions(+), 69 deletions(-) diff --git a/drivers/net/gve/base/gve_adminq.c b/drivers/net/gve/base/gve_adminq.c index 4b250a9..15a05da 100644 --- a/drivers/net/gve/base/gve_adminq.c +++ b/drivers/net/gve/base/gve_adminq.c @@ -276,8 +276,6 @@ 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 ef1c543..56e1a47 100644 --- a/drivers/net/gve/gve_ethdev.c +++ b/drivers/net/gve/gve_ethdev.c @@ -383,6 +383,8 @@ gve_start_queues(struct rte_eth_dev *dev) } } + gve_set_device_rings_ok(priv); + return 0; err_rx: @@ -395,6 +397,8 @@ err_tx: gve_stop_tx_queues(dev); else gve_stop_tx_queues_dqo(dev); + + gve_clear_device_rings_ok(priv); return ret; } @@ -440,8 +444,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); @@ -450,27 +457,18 @@ gve_dev_stop(struct rte_eth_dev *dev) gve_stop_rx_queues_dqo(dev); } - dev->data->dev_started = 0; - if (gve_is_gqi(dev->data->dev_private)) gve_free_stats_report(dev); 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); @@ -484,8 +482,67 @@ 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_free_ptype_lut_dqo(struct gve_priv *priv) +{ + if (!gve_is_gqi(priv)) { + rte_free(priv->ptype_lut_dqo); + priv->ptype_lut_dqo = NULL; + } +} - rte_free(priv->adminq); +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; @@ -1056,41 +1113,6 @@ static const struct eth_dev_ops gve_eth_dev_ops_dqo = { .reta_query = gve_rss_reta_query, }; -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) { @@ -1160,6 +1182,8 @@ gve_setup_device_resources(struct gve_priv *priv) } } + gve_set_device_resources_ok(priv); + return 0; free_ptype_lut: rte_free(priv->ptype_lut_dqo); @@ -1252,13 +1276,6 @@ free_adminq: 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) { @@ -1328,18 +1345,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) @@ -1350,7 +1355,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.50.0.727.gbf7dc18ff4-goog