From patchwork Tue May 5 19:10:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 69775 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 EA4CCA04A4; Tue, 5 May 2020 21:10:47 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 057E81D6C6; Tue, 5 May 2020 21:10:41 +0200 (CEST) Received: from relay11.mail.gandi.net (relay11.mail.gandi.net [217.70.178.231]) by dpdk.org (Postfix) with ESMTP id D91141D6BF for ; Tue, 5 May 2020 21:10:37 +0200 (CEST) Received: from localhost.localdomain (lfbn-idf2-1-566-132.w86-246.abo.wanadoo.fr [86.246.31.132]) (Authenticated sender: grive@u256.net) by relay11.mail.gandi.net (Postfix) with ESMTPSA id C100A100007 for ; Tue, 5 May 2020 19:10:37 +0000 (UTC) From: Gaetan Rivet To: dev@dpdk.org Date: Tue, 5 May 2020 21:10:29 +0200 Message-Id: <16944acc809c06be57c5a489ee7143657c4d8c6f.1588705694.git.grive@u256.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: References: MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v1 1/3] net/failsafe: avoid crash on malformed eth_dev 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" Some PMD do not respect the eth_dev API when allocating their rte_eth_dev. As a result, on device add event resulting from rte_eth_dev_probing_finish() call, the eth_dev processed is incomplete. The segfault is a good way to focus the developer on the issue, but does not inspire confidence. Instead, warn the user of the error repeatedly. The failsafe PMD can warn of the issue and continue. It will repeatedly attempt to initialize the failed port and complain about it, which should result in the same developer focus but with less crashing. Signed-off-by: Gaetan Rivet --- drivers/net/failsafe/failsafe_ether.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/failsafe/failsafe_ether.c b/drivers/net/failsafe/failsafe_ether.c index 93deacd13..2b748bd8b 100644 --- a/drivers/net/failsafe/failsafe_ether.c +++ b/drivers/net/failsafe/failsafe_ether.c @@ -623,6 +623,11 @@ failsafe_eth_new_event_callback(uint16_t port_id, FOREACH_SUBDEV_STATE(sdev, i, fs_dev, DEV_PARSED) { if (sdev->state >= DEV_PROBED) continue; + if (dev->device == NULL) { + WARN("Trying to probe malformed device %s.\n", + sdev->devargs.name); + continue; + } if (strcmp(sdev->devargs.name, dev->device->name) != 0) continue; rte_eth_dev_owner_set(port_id, &PRIV(fs_dev)->my_owner); From patchwork Tue May 5 19:10:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 69776 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 B4CB8A04A4; Tue, 5 May 2020 21:10:55 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 671401D6D2; Tue, 5 May 2020 21:10:42 +0200 (CEST) Received: from relay11.mail.gandi.net (relay11.mail.gandi.net [217.70.178.231]) by dpdk.org (Postfix) with ESMTP id E7CCE1D6BD; Tue, 5 May 2020 21:10:38 +0200 (CEST) Received: from localhost.localdomain (lfbn-idf2-1-566-132.w86-246.abo.wanadoo.fr [86.246.31.132]) (Authenticated sender: grive@u256.net) by relay11.mail.gandi.net (Postfix) with ESMTPSA id 105AC100005; Tue, 5 May 2020 19:10:37 +0000 (UTC) From: Gaetan Rivet To: dev@dpdk.org Cc: stable@dpdk.org, ferruh.yigit@intel.com, thomas@monjalon.net Date: Tue, 5 May 2020 21:10:30 +0200 Message-Id: <8aab6e5eb6d8d4769cd4e47a32403c836a13b5ef.1588705694.git.grive@u256.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: References: MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v1 2/3] net/ring: fix eth_dev device pointer on allocation 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" When a net_ring device is allocated, its device pointer is not set before calling rte_eth_dev_probing_finish, which is incorrect. The following: commit: 96cb19521147 ("net/ring: use EAL APIs in PMD specific API") commit: a6992e961050 ("net/ring: set ethernet device field") already attempted to fix this issue in 17.08, which was fine at the time. Adding the hook rte_eth_dev_probing_finish() however created this bug, as the eth_dev exposed when this hook is executed is expected to be complete. Remove the prior attempts to fix the issue in rte_pmd_ring_probe() and write the pointer properly in do_eth_dev_ring_create(). Cc: stable@dpdk.org Fixes: fbe90cdd776c ("ethdev: add probing finish function") Cc: ferruh.yigit@intel.com Cc: thomas@monjalon.net Signed-off-by: Gaetan Rivet --- drivers/net/ring/rte_eth_ring.c | 36 ++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c index 41acbc513..ad27f9d89 100644 --- a/drivers/net/ring/rte_eth_ring.c +++ b/drivers/net/ring/rte_eth_ring.c @@ -244,6 +244,26 @@ static const struct eth_dev_ops ops = { .mac_addr_add = eth_mac_addr_add, }; +static int +dev_name_cmp(const struct rte_device *dev, const void *_name) +{ + const char *name = _name; + + return strcmp(dev->name, name); +} + +static struct rte_device * +ring_device_from_name(const char *name) +{ + struct rte_bus *vdev_bus; + + vdev_bus = rte_bus_find_by_name("vdev"); + if (vdev_bus == NULL) + return NULL; + + return vdev_bus->find_device(NULL, dev_name_cmp, name); +} + static int do_eth_dev_ring_create(const char *name, struct rte_ring * const rx_queues[], @@ -294,6 +314,7 @@ do_eth_dev_ring_create(const char *name, * - store queue data in internals, * - store numa_node info in eth_dev_data * - point eth_dev_data to internals + * - store EAL device in eth_dev, * - and point eth_dev structure to new eth_dev_data structure */ @@ -325,10 +346,17 @@ do_eth_dev_ring_create(const char *name, data->kdrv = RTE_KDRV_NONE; data->numa_node = numa_node; - /* finally assign rx and tx ops */ + /* assign rx and tx ops */ eth_dev->rx_pkt_burst = eth_ring_rx; eth_dev->tx_pkt_burst = eth_ring_tx; + /* finally set the rte_device pointer in eth_dev. */ + eth_dev->device = ring_device_from_name(name); + if (eth_dev->device == NULL) { + rte_errno = ENODEV; + goto error; + } + rte_eth_dev_probing_finish(eth_dev); *eth_dev_p = eth_dev; @@ -584,9 +612,6 @@ rte_pmd_ring_probe(struct rte_vdev_device *dev) DEV_ATTACH, ð_dev); } - if (eth_dev) - eth_dev->device = &dev->device; - return ret; } @@ -644,9 +669,6 @@ rte_pmd_ring_probe(struct rte_vdev_device *dev) } } - if (eth_dev) - eth_dev->device = &dev->device; - out_free: rte_kvargs_free(kvlist); rte_free(info); From patchwork Tue May 5 19:10:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 69777 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 8D966A04A4; Tue, 5 May 2020 21:11:03 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9A66C1D6D9; Tue, 5 May 2020 21:10:43 +0200 (CEST) Received: from relay11.mail.gandi.net (relay11.mail.gandi.net [217.70.178.231]) by dpdk.org (Postfix) with ESMTP id 021B61D6C2 for ; Tue, 5 May 2020 21:10:39 +0200 (CEST) Received: from localhost.localdomain (lfbn-idf2-1-566-132.w86-246.abo.wanadoo.fr [86.246.31.132]) (Authenticated sender: grive@u256.net) by relay11.mail.gandi.net (Postfix) with ESMTPSA id 143AE100007; Tue, 5 May 2020 19:10:38 +0000 (UTC) From: Gaetan Rivet To: dev@dpdk.org Cc: wangyunjian@huawei.com, Ali Alnubani Date: Tue, 5 May 2020 21:10:31 +0200 Message-Id: <7286631f479ef296b4c6b3ff41c5ca52504b0834.1588705694.git.grive@u256.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: References: MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v1 3/3] net/failsafe: fix default service proxy state 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 service proxy is initialized at 0. This is assuming that all of its fields are invalid at 0. The issue is that a file descriptor at 0 is a valid one. The value -1 is used as sentinel during cleanup. Initialize the RX proxy file descriptor to -1. Fixes: 366226dd859f ("net/failsafe: fix fd leak") Signed-off-by: Gaetan Rivet Cc: wangyunjian@huawei.com Cc: Ali Alnubani Tested-by: Ali Alnubani --- drivers/net/failsafe/failsafe.c | 1 + drivers/net/failsafe/failsafe_private.h | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/drivers/net/failsafe/failsafe.c b/drivers/net/failsafe/failsafe.c index 8af31d71b..72362f35d 100644 --- a/drivers/net/failsafe/failsafe.c +++ b/drivers/net/failsafe/failsafe.c @@ -190,6 +190,7 @@ fs_eth_dev_create(struct rte_vdev_device *vdev) } priv = PRIV(dev); priv->data = dev->data; + priv->rxp = FS_RX_PROXY_INIT; dev->dev_ops = &failsafe_ops; dev->data->mac_addrs = &PRIV(dev)->mac_addrs[0]; dev->data->dev_link = eth_link; diff --git a/drivers/net/failsafe/failsafe_private.h b/drivers/net/failsafe/failsafe_private.h index 8e9706aef..651578a12 100644 --- a/drivers/net/failsafe/failsafe_private.h +++ b/drivers/net/failsafe/failsafe_private.h @@ -58,6 +58,14 @@ struct rx_proxy { enum rxp_service_state sstate; }; +#define FS_RX_PROXY_INIT (struct rx_proxy){ \ + .efd = -1, \ + .evec = NULL, \ + .sid = 0, \ + .scid = 0, \ + .sstate = SS_NO_SERVICE, \ +} + struct rxq { struct fs_priv *priv; uint16_t qid;