From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 Content-Transfer-Encoding: 8bit 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); -- 2.26.2