From patchwork Sun Sep 27 23:42:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Monjalon X-Patchwork-Id: 78950 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id D4CFCA04C0; Mon, 28 Sep 2020 01:51:12 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 580221D6B4; Mon, 28 Sep 2020 01:44:55 +0200 (CEST) Received: from new4-smtp.messagingengine.com (new4-smtp.messagingengine.com [66.111.4.230]) by dpdk.org (Postfix) with ESMTP id CF86C1D604 for ; Mon, 28 Sep 2020 01:44:20 +0200 (CEST) Received: from compute7.internal (compute7.nyi.internal [10.202.2.47]) by mailnew.nyi.internal (Postfix) with ESMTP id 814BA58012A; Sun, 27 Sep 2020 19:44:20 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute7.internal (MEProxy); Sun, 27 Sep 2020 19:44:20 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm2; bh=28hMPw3vl8P9W /pnGyGvsrYPGG86qBn5tdFXhnUSfa8=; b=VnptHm7jemd1vZJzksUPo2wsA6OYI Hzh+w1FDYWsN1dc+TeXnF3+6ieM26x5hlektjeOnU9wU0WA3YeRbu2g2FTLTm+s7 HBM95wXGDbGiOBTm560vCNAx32YFNnrb96aLZrkighJWBwuu85L8Hn2+gCdfcESE tAysZje/pbMM9YRPGocniQxAH+TqHP8IFp+AuF18dC+SP5Au/Nph8DDKPimY/k7a qEXvfxizu3UN+j5cHhdDawOKCA+rrLVrhJD07x7UB3mJz/iZSE/VVgYnan4yLYi3 I+0ZiELsAVN3CxdvUhVYeE1nTKZX0OUFonkMhwx/qQFc9E+7prQuG/uSQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm3; bh=28hMPw3vl8P9W/pnGyGvsrYPGG86qBn5tdFXhnUSfa8=; b=lRaHvs9f ROckK2YK8DpNPzd8p1qBX+90dZgNCFtpRr44p/isClxKhI3AkNcsXy6BBFRFvQry dAzRfDvwKpIeehpgytzFhTcikA9owFtX3Q977nHg/5z2RuyCnj7ChrBgBs1Na050 68OJEo2KFW0M0uP/btqlRrLM3ICJ9DSd0qW8Xi36lBdO4sMHPaAjoi+rcH9BeHj/ cVWO2qKZtXsZmbvkQ18gaCCYsArB9Y7rqBBFsISxlBhxLnk0l7jMC1wCG1/fNFqT 0j0y9EvwvvYBlmt3J/gw8rWcWTMobSdV7Cy2KL5qKl4DiNLmGOAFgtgLlOP4H4bK Vz+jW96VotAOtw== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedujedrvdehgddvhecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhvffufffkofgjfhgggfestdekredtredttdenucfhrhhomhepvfhhohhmrghs ucfoohhnjhgrlhhonhcuoehthhhomhgrshesmhhonhhjrghlohhnrdhnvghtqeenucggtf frrghtthgvrhhnpedvhefgiedvjeegtdevheefhfetleefgfeivefgffevfeejgedtgfeu tdehtdegveenucfkphepjeejrddufeegrddvtdefrddukeegnecuvehluhhsthgvrhfuih iivgepvdeinecurfgrrhgrmhepmhgrihhlfhhrohhmpehthhhomhgrshesmhhonhhjrghl ohhnrdhnvght X-ME-Proxy: Received: from xps.monjalon.net (184.203.134.77.rev.sfr.net [77.134.203.184]) by mail.messagingengine.com (Postfix) with ESMTPA id 40F76328005D; Sun, 27 Sep 2020 19:44:18 -0400 (EDT) From: Thomas Monjalon To: dev@dpdk.org Cc: ferruh.yigit@intel.com, arybchenko@solarflare.com, Ray Kinsella , Neil Horman , Rahul Lakkireddy , Gaetan Rivet , Jakub Grajciar , Matan Azrad , Shahaf Shuler , Viacheslav Ovsiienko , Zyta Szpak , Liron Himi , Stephen Hemminger , "K. Y. Srinivasan" , Haiyang Zhang , Long Li , Maxime Coquelin , Chenbo Xia , Zhihong Wang Date: Mon, 28 Sep 2020 01:42:49 +0200 Message-Id: <20200927234249.3198780-26-thomas@monjalon.net> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200927234249.3198780-1-thomas@monjalon.net> References: <20200913220711.3768597-1-thomas@monjalon.net> <20200927234249.3198780-1-thomas@monjalon.net> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 25/25] ethdev: allow close function to return an error X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" The API function rte_eth_dev_close() was returning void. The return type is changed to int for notifying of errors. If an error happens during a close operation, the status of the port is undefined, a maximum of resources having been freed. Signed-off-by: Thomas Monjalon Reviewed-by: Liron Himi Signed-off-by: Thomas Monjalon --- doc/guides/rel_notes/deprecation.rst | 1 - doc/guides/rel_notes/release_20_11.rst | 4 +++- drivers/net/cxgbe/cxgbe_ethdev.c | 5 +++-- drivers/net/cxgbe/cxgbevf_ethdev.c | 5 +++-- drivers/net/failsafe/failsafe_ether.c | 6 +++++- drivers/net/failsafe/failsafe_ops.c | 5 ++++- drivers/net/memif/rte_eth_memif.c | 4 +--- drivers/net/mlx5/mlx5.c | 7 ++++--- drivers/net/mvneta/mvneta_ethdev.c | 5 +++-- drivers/net/mvpp2/mrvl_ethdev.c | 5 +++-- drivers/net/netvsc/hn_ethdev.c | 6 ++++-- drivers/net/netvsc/hn_var.h | 2 +- drivers/net/netvsc/hn_vf.c | 7 +++++-- drivers/net/virtio/virtio_user_ethdev.c | 4 +--- lib/librte_ethdev/rte_ethdev.c | 13 ++++++++----- lib/librte_ethdev/rte_ethdev.h | 5 ++++- 16 files changed, 52 insertions(+), 32 deletions(-) diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index a907358078..bfa43990f0 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -140,7 +140,6 @@ Deprecation Notices invalid port ID, unsupported operation, failed operation): - ``rte_eth_dev_stop`` - - ``rte_eth_dev_close`` * ethdev: New offload flags ``DEV_RX_OFFLOAD_FLOW_MARK`` will be added in 19.11. This will allow application to enable or disable PMDs from updating diff --git a/doc/guides/rel_notes/release_20_11.rst b/doc/guides/rel_notes/release_20_11.rst index f377ab8e87..ec5a3937e8 100644 --- a/doc/guides/rel_notes/release_20_11.rst +++ b/doc/guides/rel_notes/release_20_11.rst @@ -152,7 +152,9 @@ API Changes * ethdev: ``rte_eth_rx_descriptor_done()`` API has been deprecated. -* Renamed internal ethdev APIs: +* ethdev: Added ``int`` return type to ``rte_eth_dev_close()``. + +* ethdev: Renamed internal functions: * ``_rte_eth_dev_callback_process()`` -> ``rte_eth_dev_callback_process()`` * ``_rte_eth_dev_reset`` -> ``rte_eth_dev_internal_reset()`` diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c index 16beb2d435..fe488231a7 100644 --- a/drivers/net/cxgbe/cxgbe_ethdev.c +++ b/drivers/net/cxgbe/cxgbe_ethdev.c @@ -1296,12 +1296,13 @@ static int eth_cxgbe_dev_uninit(struct rte_eth_dev *eth_dev) { struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); uint16_t port_id; + int err = 0; /* Free up other ports and all resources */ RTE_ETH_FOREACH_DEV_OF(port_id, &pci_dev->device) - rte_eth_dev_close(port_id); + err |= rte_eth_dev_close(port_id); - return 0; + return err == 0 ? 0 : -EIO; } static int eth_cxgbe_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, diff --git a/drivers/net/cxgbe/cxgbevf_ethdev.c b/drivers/net/cxgbe/cxgbevf_ethdev.c index 947fcdd406..c2918f5356 100644 --- a/drivers/net/cxgbe/cxgbevf_ethdev.c +++ b/drivers/net/cxgbe/cxgbevf_ethdev.c @@ -183,12 +183,13 @@ static int eth_cxgbevf_dev_uninit(struct rte_eth_dev *eth_dev) { struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); uint16_t port_id; + int err = 0; /* Free up other ports and all resources */ RTE_ETH_FOREACH_DEV_OF(port_id, &pci_dev->device) - rte_eth_dev_close(port_id); + err |= rte_eth_dev_close(port_id); - return 0; + return err == 0 ? 0 : -EIO; } static int eth_cxgbevf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, diff --git a/drivers/net/failsafe/failsafe_ether.c b/drivers/net/failsafe/failsafe_ether.c index 7c68bbdec0..950d35dac4 100644 --- a/drivers/net/failsafe/failsafe_ether.c +++ b/drivers/net/failsafe/failsafe_ether.c @@ -287,7 +287,11 @@ fs_dev_remove(struct sub_device *sdev) /* fallthrough */ case DEV_ACTIVE: failsafe_eth_dev_unregister_callbacks(sdev); - rte_eth_dev_close(PORT_ID(sdev)); + ret = rte_eth_dev_close(PORT_ID(sdev)); + if (ret < 0) { + ERROR("Port close failed for sub-device %u", + PORT_ID(sdev)); + } sdev->state = DEV_PROBED; /* fallthrough */ case DEV_PROBED: diff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c index 0ce7dfc8a6..79b24ec996 100644 --- a/drivers/net/failsafe/failsafe_ops.c +++ b/drivers/net/failsafe/failsafe_ops.c @@ -648,7 +648,10 @@ failsafe_eth_dev_close(struct rte_eth_dev *dev) FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) { DEBUG("Closing sub_device %d", i); failsafe_eth_dev_unregister_callbacks(sdev); - rte_eth_dev_close(PORT_ID(sdev)); + ret = rte_eth_dev_close(PORT_ID(sdev)); + if (ret) + ERROR("Error while closing sub-device %u", + PORT_ID(sdev)); sdev->state = DEV_ACTIVE - 1; } rte_eth_dev_callback_unregister(RTE_ETH_ALL, RTE_ETH_EVENT_NEW, diff --git a/drivers/net/memif/rte_eth_memif.c b/drivers/net/memif/rte_eth_memif.c index ff8a58081f..33bf5c68a3 100644 --- a/drivers/net/memif/rte_eth_memif.c +++ b/drivers/net/memif/rte_eth_memif.c @@ -1798,9 +1798,7 @@ rte_pmd_memif_remove(struct rte_vdev_device *vdev) if (eth_dev == NULL) return 0; - rte_eth_dev_close(eth_dev->data->port_id); - - return 0; + return rte_eth_dev_close(eth_dev->data->port_id); } static struct rte_vdev_driver pmd_memif_drv = { diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index 01ead6e6af..2e2f0b274c 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -2010,6 +2010,7 @@ static int mlx5_pci_remove(struct rte_pci_device *pci_dev) { uint16_t port_id; + int ret = 0; RTE_ETH_FOREACH_DEV_OF(port_id, &pci_dev->device) { /* @@ -2017,11 +2018,11 @@ mlx5_pci_remove(struct rte_pci_device *pci_dev) * call the close function explicitly for secondary process. */ if (rte_eal_process_type() == RTE_PROC_SECONDARY) - mlx5_dev_close(&rte_eth_devices[port_id]); + ret |= mlx5_dev_close(&rte_eth_devices[port_id]); else - rte_eth_dev_close(port_id); + ret |= rte_eth_dev_close(port_id); } - return 0; + return ret == 0 ? 0 : -EIO; } static const struct rte_pci_id mlx5_pci_id_map[] = { diff --git a/drivers/net/mvneta/mvneta_ethdev.c b/drivers/net/mvneta/mvneta_ethdev.c index 607771149a..13d4b6af6b 100644 --- a/drivers/net/mvneta/mvneta_ethdev.c +++ b/drivers/net/mvneta/mvneta_ethdev.c @@ -964,14 +964,15 @@ static int rte_pmd_mvneta_remove(struct rte_vdev_device *vdev) { uint16_t port_id; + int ret = 0; RTE_ETH_FOREACH_DEV(port_id) { if (rte_eth_devices[port_id].device != &vdev->device) continue; - rte_eth_dev_close(port_id); + ret = rte_eth_dev_close(port_id); } - return 0; + return ret == 0 ? 0 : -EIO; } static struct rte_vdev_driver pmd_mvneta_drv = { diff --git a/drivers/net/mvpp2/mrvl_ethdev.c b/drivers/net/mvpp2/mrvl_ethdev.c index a230a96840..acc8c70a95 100644 --- a/drivers/net/mvpp2/mrvl_ethdev.c +++ b/drivers/net/mvpp2/mrvl_ethdev.c @@ -3022,14 +3022,15 @@ static int rte_pmd_mrvl_remove(struct rte_vdev_device *vdev) { uint16_t port_id; + int ret = 0; RTE_ETH_FOREACH_DEV(port_id) { if (rte_eth_devices[port_id].device != &vdev->device) continue; - rte_eth_dev_close(port_id); + ret = rte_eth_dev_close(port_id); } - return 0; + return ret == 0 ? 0 : -EIO; } static struct rte_vdev_driver pmd_mrvl_drv = { diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c index 9af64821a1..3fa39dbebc 100644 --- a/drivers/net/netvsc/hn_ethdev.c +++ b/drivers/net/netvsc/hn_ethdev.c @@ -841,14 +841,16 @@ hn_dev_stop(struct rte_eth_dev *dev) static int hn_dev_close(struct rte_eth_dev *dev) { + int ret; + PMD_INIT_FUNC_TRACE(); if (rte_eal_process_type() != RTE_PROC_PRIMARY) return 0; - hn_vf_close(dev); + ret = hn_vf_close(dev); hn_dev_free_queues(dev); - return 0; + return ret; } static const struct eth_dev_ops hn_eth_dev_ops = { diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h index 4b63f87607..74f30669ac 100644 --- a/drivers/net/netvsc/hn_var.h +++ b/drivers/net/netvsc/hn_var.h @@ -217,7 +217,7 @@ const uint32_t *hn_vf_supported_ptypes(struct rte_eth_dev *dev); int hn_vf_start(struct rte_eth_dev *dev); void hn_vf_reset(struct rte_eth_dev *dev); void hn_vf_stop(struct rte_eth_dev *dev); -void hn_vf_close(struct rte_eth_dev *dev); +int hn_vf_close(struct rte_eth_dev *dev); int hn_vf_allmulticast_enable(struct rte_eth_dev *dev); int hn_vf_allmulticast_disable(struct rte_eth_dev *dev); diff --git a/drivers/net/netvsc/hn_vf.c b/drivers/net/netvsc/hn_vf.c index f5f15c0462..d29eee7627 100644 --- a/drivers/net/netvsc/hn_vf.c +++ b/drivers/net/netvsc/hn_vf.c @@ -316,18 +316,21 @@ void hn_vf_reset(struct rte_eth_dev *dev) VF_ETHDEV_FUNC(dev, rte_eth_dev_reset); } -void hn_vf_close(struct rte_eth_dev *dev) +int hn_vf_close(struct rte_eth_dev *dev) { struct hn_data *hv = dev->data->dev_private; uint16_t vf_port; + int ret = 0; rte_rwlock_read_lock(&hv->vf_lock); vf_port = hv->vf_port; if (vf_port != HN_INVALID_PORT) - rte_eth_dev_close(vf_port); + ret = rte_eth_dev_close(vf_port); hv->vf_port = HN_INVALID_PORT; rte_rwlock_read_unlock(&hv->vf_lock); + + return ret; } int hn_vf_stats_reset(struct rte_eth_dev *dev) diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 87f6cb6950..865f73807f 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -813,9 +813,7 @@ virtio_user_pmd_remove(struct rte_vdev_device *vdev) return rte_eth_dev_release_port(eth_dev); /* make sure the device is stopped, queues freed */ - rte_eth_dev_close(eth_dev->data->port_id); - - return 0; + return rte_eth_dev_close(eth_dev->data->port_id); } static struct rte_vdev_driver virtio_user_driver = { diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index 5c0e8f170e..6091630a2f 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -1705,19 +1705,22 @@ rte_eth_dev_set_link_down(uint16_t port_id) return eth_err(port_id, (*dev->dev_ops->dev_set_link_down)(dev)); } -void +int rte_eth_dev_close(uint16_t port_id) { struct rte_eth_dev *dev; + int ret; - RTE_ETH_VALID_PORTID_OR_RET(port_id); + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL); dev = &rte_eth_devices[port_id]; - RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_close); - (*dev->dev_ops->dev_close)(dev); + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_close, -ENOTSUP); + ret = (*dev->dev_ops->dev_close)(dev); rte_ethdev_trace_close(port_id); - rte_eth_dev_release_port(dev); + ret = rte_eth_dev_release_port(dev); + + return ret; } int diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h index 24d898ae89..4380d8ecf6 100644 --- a/lib/librte_ethdev/rte_ethdev.h +++ b/lib/librte_ethdev/rte_ethdev.h @@ -2281,8 +2281,11 @@ int rte_eth_dev_set_link_down(uint16_t port_id); * * @param port_id * The port identifier of the Ethernet device. + * @return + * - Zero if the port is closed successfully. + * - Negative if something went wrong. */ -void rte_eth_dev_close(uint16_t port_id); +int rte_eth_dev_close(uint16_t port_id); /** * Reset a Ethernet device and keep its port id.