From patchwork Fri Sep 28 16:40:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Monjalon X-Patchwork-Id: 45598 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E1FAE1B3A4; Fri, 28 Sep 2018 18:40:48 +0200 (CEST) Received: from out3-smtp.messagingengine.com (out3-smtp.messagingengine.com [66.111.4.27]) by dpdk.org (Postfix) with ESMTP id 1BC421B396 for ; Fri, 28 Sep 2018 18:40:48 +0200 (CEST) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 9FB4121F8F; Fri, 28 Sep 2018 12:40:47 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Fri, 28 Sep 2018 12:40:47 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to:x-me-sender:x-me-sender :x-sasl-enc; s=mesmtp; bh=tkKJCaXko6iiNoss2PJeY1qrIUm6bQYDwzZ8ld XhIgE=; b=RYWZUxyr4J3ghft9EBIF8E5T4qYZCW9x6DeO/NR+Zo8iqlJSB5B8iw bVEhjN+MBWsd+sDw16b+niyA1j17MeA6t5AV/pF08o+fRmNAbef2J7kqe7VxSAQb E+k31q2cyYlwxX8IqMIED3J6yPRQNu4d5pFM+gCTKmtpW16aPd+T0= 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-sender:x-me-sender:x-sasl-enc; s=fm3; bh=tkKJCaXko6iiNoss2 PJeY1qrIUm6bQYDwzZ8ldXhIgE=; b=SO7y9cmpBDOiA5fQd96EtooAJ64Tcoi4U 5vMZkPUbFwOA6zhaXiMysCkdLizKv7OUjosDUrDM/U+ZMPv453KDF3wRq5hOVdGu nzyIWAHLRAMRto7Qs/gbYV/KPcPKmhPndDFRMJgm0OeuZgSL8L1PimviD0CBWVx0 5/qlYLZsKybZ/iMX+6CnFUMEkPtM+iQDVM37EWSf/9SjUdn1eyV+RpnBMGBbz2Z1 BMZB8UeYq37jAeW8wC+3VY+u3jlFoCsVI//xT52F+vDCP3pBnPqPEUL2+KOqC4hQ Fs7NfOIzUBn9U3K9LJ/gxJaiGJzhXxXQ1y6P3FWXIiLnahPFwBADA== X-ME-Proxy: X-ME-Sender: Received: from xps.monjalon.net (184.203.134.77.rev.sfr.net [77.134.203.184]) by mail.messagingengine.com (Postfix) with ESMTPA id 9DDA4102E0; Fri, 28 Sep 2018 12:40:46 -0400 (EDT) From: Thomas Monjalon To: dev@dpdk.org Cc: gaetan.rivet@6wind.com, ophirmu@mellanox.com, qi.z.zhang@intel.com, ferruh.yigit@intel.com Date: Fri, 28 Sep 2018 18:40:37 +0200 Message-Id: <20180928164039.2380-2-thomas@monjalon.net> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180928164039.2380-1-thomas@monjalon.net> References: <20180907230958.21402-1-thomas@monjalon.net> <20180928164039.2380-1-thomas@monjalon.net> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 1/3] drivers/bus: move driver assignment to end of probing 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 PCI mapping requires to know the PCI driver to use, even before the probing is done. That's why the PCI driver is referenced early inside the PCI device structure. See 1d20a073fa5e ("bus/pci: reference driver structure before mapping") However the rte_driver does not need to be referenced in rte_device before the device probing is done. By moving back this assignment at the end of the device probing, it becomes possible to make clear the status of a rte_device. Signed-off-by: Thomas Monjalon --- drivers/bus/ifpga/ifpga_bus.c | 9 ++++----- drivers/bus/pci/pci_common.c | 7 +++---- drivers/bus/pci/rte_bus_pci.h | 2 +- drivers/bus/vdev/vdev.c | 5 ++--- drivers/bus/vmbus/vmbus_common.c | 5 +++-- drivers/net/i40e/i40e_vf_representor.c | 3 --- drivers/net/mlx4/mlx4.c | 1 - drivers/net/mlx5/mlx5.c | 1 - lib/librte_eal/common/include/rte_dev.h | 2 +- 9 files changed, 14 insertions(+), 21 deletions(-) diff --git a/drivers/bus/ifpga/ifpga_bus.c b/drivers/bus/ifpga/ifpga_bus.c index 3ef035b7e..a20afb5c7 100644 --- a/drivers/bus/ifpga/ifpga_bus.c +++ b/drivers/bus/ifpga/ifpga_bus.c @@ -279,14 +279,13 @@ ifpga_probe_one_driver(struct rte_afu_driver *drv, /* reference driver structure */ afu_dev->driver = drv; - afu_dev->device.driver = &drv->driver; /* call the driver probe() function */ ret = drv->probe(afu_dev); - if (ret) { + if (ret) afu_dev->driver = NULL; - afu_dev->device.driver = NULL; - } + else + afu_dev->device.driver = &drv->driver; return ret; } @@ -301,7 +300,7 @@ ifpga_probe_all_drivers(struct rte_afu_device *afu_dev) return -1; /* Check if a driver is already loaded */ - if (afu_dev->driver != NULL) + if (afu_dev->device.driver != NULL) return 0; TAILQ_FOREACH(drv, &ifpga_afu_drv_list, next) { diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index 7736b3f9c..a0adc99c8 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -162,14 +162,12 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr, * driver flags for adjusting configuration. */ dev->driver = dr; - dev->device.driver = &dr->driver; if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) { /* map resources for devices that use igb_uio */ ret = rte_pci_map_device(dev); if (ret != 0) { dev->driver = NULL; - dev->device.driver = NULL; return ret; } } @@ -178,7 +176,6 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr, ret = dr->probe(dr, dev); if (ret) { dev->driver = NULL; - dev->device.driver = NULL; if ((dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) && /* Don't unmap if device is unsupported and * driver needs mapped resources. @@ -186,6 +183,8 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr, !(ret > 0 && (dr->drv_flags & RTE_PCI_DRV_KEEP_MAPPED_RES))) rte_pci_unmap_device(dev); + } else { + dev->device.driver = &dr->driver; } return ret; @@ -246,7 +245,7 @@ pci_probe_all_drivers(struct rte_pci_device *dev) return -1; /* Check if a driver is already loaded */ - if (dev->driver != NULL) + if (dev->device.driver != NULL) return 0; FOREACH_DRIVER_ON_PCIBUS(dr) { diff --git a/drivers/bus/pci/rte_bus_pci.h b/drivers/bus/pci/rte_bus_pci.h index 0d1955ffe..984df2b37 100644 --- a/drivers/bus/pci/rte_bus_pci.h +++ b/drivers/bus/pci/rte_bus_pci.h @@ -62,7 +62,7 @@ struct rte_pci_device { struct rte_mem_resource mem_resource[PCI_MAX_RESOURCE]; /**< PCI Memory Resource */ struct rte_intr_handle intr_handle; /**< Interrupt handle */ - struct rte_pci_driver *driver; /**< Associated driver */ + struct rte_pci_driver *driver; /**< PCI driver used in probing */ uint16_t max_vfs; /**< sriov enable if not zero */ enum rte_kernel_driver kdrv; /**< Kernel driver passthrough */ char name[PCI_PRI_STR_SIZE+1]; /**< PCI location (ASCII) */ diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c index 390c2ce70..e7f321706 100644 --- a/drivers/bus/vdev/vdev.c +++ b/drivers/bus/vdev/vdev.c @@ -149,10 +149,9 @@ vdev_probe_all_drivers(struct rte_vdev_device *dev) if (vdev_parse(name, &driver)) return -1; - dev->device.driver = &driver->driver; ret = driver->probe(dev); - if (ret) - dev->device.driver = NULL; + if (ret == 0) + dev->device.driver = &driver->driver; return ret; } diff --git a/drivers/bus/vmbus/vmbus_common.c b/drivers/bus/vmbus/vmbus_common.c index e3ceb6906..de5548aa4 100644 --- a/drivers/bus/vmbus/vmbus_common.c +++ b/drivers/bus/vmbus/vmbus_common.c @@ -111,7 +111,6 @@ vmbus_probe_one_driver(struct rte_vmbus_driver *dr, /* reference driver structure */ dev->driver = dr; - dev->device.driver = &dr->driver; if (dev->device.numa_node < 0) { VMBUS_LOG(WARNING, " Invalid NUMA socket, default to 0"); @@ -124,6 +123,8 @@ vmbus_probe_one_driver(struct rte_vmbus_driver *dr, if (ret) { dev->driver = NULL; rte_vmbus_unmap_device(dev); + } else { + dev->device.driver = &dr->driver; } return ret; @@ -142,7 +143,7 @@ vmbus_probe_all_drivers(struct rte_vmbus_device *dev) int rc; /* Check if a driver is already loaded */ - if (dev->driver != NULL) { + if (dev->device.driver != NULL) { VMBUS_LOG(DEBUG, "VMBUS driver already loaded"); return 0; } diff --git a/drivers/net/i40e/i40e_vf_representor.c b/drivers/net/i40e/i40e_vf_representor.c index f9f131611..1e9998278 100644 --- a/drivers/net/i40e/i40e_vf_representor.c +++ b/drivers/net/i40e/i40e_vf_representor.c @@ -486,9 +486,6 @@ i40e_vf_representor_init(struct rte_eth_dev *ethdev, void *init_params) if (representor->vf_id >= pf->vf_num) return -ENODEV; - /** representor shares the same driver as it's PF device */ - ethdev->device->driver = representor->adapter->eth_dev->device->driver; - /* Set representor device ops */ ethdev->dev_ops = &i40e_representor_dev_ops; diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index defc0d4b0..3de7bc53e 100644 --- a/drivers/net/mlx4/mlx4.c +++ b/drivers/net/mlx4/mlx4.c @@ -734,7 +734,6 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev) eth_dev->data->mac_addrs = priv->mac; eth_dev->device = &pci_dev->device; rte_eth_copy_pci_info(eth_dev, pci_dev); - eth_dev->device->driver = &mlx4_driver.driver; /* Initialize local interrupt handle for current port. */ priv->intr_handle = (struct rte_intr_handle){ .fd = -1, diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index 30d4e70a7..f5f3a3d19 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -1081,7 +1081,6 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, priv->dev_data = eth_dev->data; eth_dev->data->mac_addrs = priv->mac; eth_dev->device = dpdk_dev; - eth_dev->device->driver = &mlx5_driver.driver; err = mlx5_uar_init_primary(eth_dev); if (err) { err = rte_errno; diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h index ee77e4006..61542c7d1 100644 --- a/lib/librte_eal/common/include/rte_dev.h +++ b/lib/librte_eal/common/include/rte_dev.h @@ -156,7 +156,7 @@ struct rte_driver { struct rte_device { TAILQ_ENTRY(rte_device) next; /**< Next device */ const char *name; /**< Device name */ - const struct rte_driver *driver;/**< Associated driver */ + const struct rte_driver *driver; /**< Driver associated after probing */ int numa_node; /**< NUMA node connection */ struct rte_devargs *devargs; /**< Device user arguments */ }; From patchwork Fri Sep 28 16:40:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Monjalon X-Patchwork-Id: 45600 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 050051B45A; Fri, 28 Sep 2018 18:40:59 +0200 (CEST) Received: from out3-smtp.messagingengine.com (out3-smtp.messagingengine.com [66.111.4.27]) by dpdk.org (Postfix) with ESMTP id D74DA1B396 for ; Fri, 28 Sep 2018 18:40:48 +0200 (CEST) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 82D9D21D2E; Fri, 28 Sep 2018 12:40:48 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Fri, 28 Sep 2018 12:40:48 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to:x-me-sender:x-me-sender :x-sasl-enc; s=mesmtp; bh=sBoS9Q/Q3TTuqrR5vS6xrtcaZTXJcMqLSN3dF9 Ngxig=; b=jZLyARIbWk0h//Ghrd/fMRz2GyF+j8AMS0c7UZdVX3KO94R6mROjxO V3/29rIp3ANCSGEruL03PzR+vOuX+8zHQ4HLcgm2vo32AJSignc4gXErkDH4acNv fkGuvbtvUsps7SlWMVQBFFZ8kaqPowNf6ky4nLGE9Hn+8Y3GLZqWo= 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-sender:x-me-sender:x-sasl-enc; s=fm3; bh=sBoS9Q/Q3TTuqrR5v S6xrtcaZTXJcMqLSN3dF9Ngxig=; b=NYVkZwwKplPc0eCCPU8VEODJNaB+zyUOs 3j8DHm+EEeT22wMoNYh4UE93a+IpjXm7UD3DLPFBg254D4fqCcwB0dDmMSyJOGqU /ZAlhSGxadVLwI6u40zR8AFDbP7FpC7J+AcW0quCLDx29yk5cNNFrubpy6W1KAc0 vylf45S1Av9lUWIoZz3zDW4XowXH1gNOzJkTktUJcji0F9bzwp8BVCnyWUj1nEmw dtom2daHSstTVxCXEJrjJkgdd7MKhZyeBPmsChBt5U0MwRptLh9Qd2GXlD8WQ1Hs GmCPS6TjRKpvigkO5fFR98xrFMqvLV3aqWREZ5X1kJqV/Djv+5UlQ== X-ME-Proxy: X-ME-Sender: Received: from xps.monjalon.net (184.203.134.77.rev.sfr.net [77.134.203.184]) by mail.messagingengine.com (Postfix) with ESMTPA id 834F6102DD; Fri, 28 Sep 2018 12:40:47 -0400 (EDT) From: Thomas Monjalon To: dev@dpdk.org Cc: gaetan.rivet@6wind.com, ophirmu@mellanox.com, qi.z.zhang@intel.com, ferruh.yigit@intel.com Date: Fri, 28 Sep 2018 18:40:38 +0200 Message-Id: <20180928164039.2380-3-thomas@monjalon.net> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180928164039.2380-1-thomas@monjalon.net> References: <20180907230958.21402-1-thomas@monjalon.net> <20180928164039.2380-1-thomas@monjalon.net> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 2/3] eal: add function to query device status 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 function rte_dev_is_probed() is added in order to improve semantic and enforce proper check of the probing status of a device. It will answer this rte_device query: Is it already successfully probed or not? Signed-off-by: Thomas Monjalon --- drivers/bus/ifpga/ifpga_bus.c | 4 ++-- drivers/bus/pci/pci_common.c | 2 +- drivers/bus/vdev/vdev.c | 2 +- drivers/bus/vmbus/vmbus_common.c | 2 +- lib/librte_eal/common/eal_common_dev.c | 9 ++++++++- lib/librte_eal/common/include/rte_dev.h | 14 ++++++++++++++ lib/librte_eal/rte_eal_version.map | 1 + 7 files changed, 28 insertions(+), 6 deletions(-) diff --git a/drivers/bus/ifpga/ifpga_bus.c b/drivers/bus/ifpga/ifpga_bus.c index a20afb5c7..5ce886d13 100644 --- a/drivers/bus/ifpga/ifpga_bus.c +++ b/drivers/bus/ifpga/ifpga_bus.c @@ -300,7 +300,7 @@ ifpga_probe_all_drivers(struct rte_afu_device *afu_dev) return -1; /* Check if a driver is already loaded */ - if (afu_dev->device.driver != NULL) + if (rte_dev_is_probed(&afu_dev->device)) return 0; TAILQ_FOREACH(drv, &ifpga_afu_drv_list, next) { @@ -324,7 +324,7 @@ ifpga_probe(void) int ret = 0; TAILQ_FOREACH(afu_dev, &ifpga_afu_dev_list, next) { - if (afu_dev->device.driver) + if (rte_dev_is_probed(&afu_dev->device)) continue; ret = ifpga_probe_all_drivers(afu_dev); diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index a0adc99c8..d95410e19 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -245,7 +245,7 @@ pci_probe_all_drivers(struct rte_pci_device *dev) return -1; /* Check if a driver is already loaded */ - if (dev->device.driver != NULL) + if (rte_dev_is_probed(&dev->device)) return 0; FOREACH_DRIVER_ON_PCIBUS(dr) { diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c index e7f321706..514d9d5c6 100644 --- a/drivers/bus/vdev/vdev.c +++ b/drivers/bus/vdev/vdev.c @@ -479,7 +479,7 @@ vdev_probe(void) * we call each driver probe. */ - if (dev->device.driver) + if (rte_dev_is_probed(&dev->device)) continue; if (vdev_probe_all_drivers(dev)) { diff --git a/drivers/bus/vmbus/vmbus_common.c b/drivers/bus/vmbus/vmbus_common.c index de5548aa4..48a219f73 100644 --- a/drivers/bus/vmbus/vmbus_common.c +++ b/drivers/bus/vmbus/vmbus_common.c @@ -143,7 +143,7 @@ vmbus_probe_all_drivers(struct rte_vmbus_device *dev) int rc; /* Check if a driver is already loaded */ - if (dev->device.driver != NULL) { + if (rte_dev_is_probed(&dev->device)) { VMBUS_LOG(DEBUG, "VMBUS driver already loaded"); return 0; } diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c index b40e4c0d0..907c5c481 100644 --- a/lib/librte_eal/common/eal_common_dev.c +++ b/lib/librte_eal/common/eal_common_dev.c @@ -74,6 +74,13 @@ static int cmp_dev_name(const struct rte_device *dev, const void *_name) return strcmp(dev->name, name); } +int __rte_experimental +rte_dev_is_probed(const struct rte_device *dev) +{ + /* The field driver should be set only when the probe is successful. */ + return dev->driver != NULL; +} + int rte_eal_dev_attach(const char *name, const char *devargs) { struct rte_bus *bus; @@ -184,7 +191,7 @@ rte_dev_probe(const char *devargs) goto err_devarg; } - if (dev->driver != NULL) { + if (rte_dev_is_probed(dev)) { RTE_LOG(ERR, EAL, "Device is already plugged\n"); return -EEXIST; } diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h index 61542c7d1..5b16ee27b 100644 --- a/lib/librte_eal/common/include/rte_dev.h +++ b/lib/librte_eal/common/include/rte_dev.h @@ -161,6 +161,20 @@ struct rte_device { struct rte_devargs *devargs; /**< Device user arguments */ }; +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice + * + * Query status of a device. + * + * @param dev + * Generic device pointer. + * @return + * (int)true if already probed successfully, 0 otherwise. + */ +__rte_experimental +int rte_dev_is_probed(const struct rte_device *dev); + /** * Attach a device to a registered driver. * diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 2ea7a870a..dddcb81ea 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -279,6 +279,7 @@ EXPERIMENTAL { rte_dev_event_callback_unregister; rte_dev_event_monitor_start; rte_dev_event_monitor_stop; + rte_dev_is_probed; rte_dev_iterator_init; rte_dev_iterator_next; rte_dev_probe; From patchwork Fri Sep 28 16:40:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Monjalon X-Patchwork-Id: 45601 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9D5DA1B494; Fri, 28 Sep 2018 18:41:01 +0200 (CEST) Received: from out3-smtp.messagingengine.com (out3-smtp.messagingengine.com [66.111.4.27]) by dpdk.org (Postfix) with ESMTP id 33CB61B468 for ; Fri, 28 Sep 2018 18:40:51 +0200 (CEST) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id B1CB221FC7; Fri, 28 Sep 2018 12:40:49 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Fri, 28 Sep 2018 12:40:50 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to:x-me-sender:x-me-sender :x-sasl-enc; s=mesmtp; bh=+ULyQTGIGoAxbiOhA83OYKru5u0PnJ1yWj9NUd WSdso=; b=LcE97/06oTfymmd0BS+gmxwEFqjHK6ZrEu3cYCmjL8blIY8Pju/WAH MxCC1m5xZmkEpa68w2garAIYP/Pkx8uu4NkzzOrFtL9+6FvSlrVmn5RrlXBI7Kqc IuAMyw0gmnlY+jQO30Blq1MFFdw/a6e/5Myd9WtF/UMxMfAKce70o= 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-sender:x-me-sender:x-sasl-enc; s=fm3; bh=+ULyQTGIGoAxbiOhA 83OYKru5u0PnJ1yWj9NUdWSdso=; b=KQb1cl5+pOxjCGimf5kWIquXYSFwfpR2T tYDWW3cJg3iLH0c03hbPDMubUqjTLQGAAH/Jd3FdzdGkn+rhP6R9I7L+0HhxN93w yrcRjy2fOOt3f4Zd/YgsgqQ/jhFrxDdvD96EcfaEi3Y0umhR5OPilJytgTGbwpTB xbeFuYaZtTqQfIa+hSUpaiSsehTr8LuJUXIWDJPCI313lL3BlCuY4AM+co1IYyST 1uw04QX26C5cvr0vTlEIqVCHWWGZ1WZzoaMeZ80EIYQ3gFAhvCPvTzpNhssbFK98 pR/LRFOTpHjuKXTepap5UTYsPPlJNfqc7FCUffYuQfoLcAODRpyIg== X-ME-Proxy: X-ME-Sender: Received: from xps.monjalon.net (184.203.134.77.rev.sfr.net [77.134.203.184]) by mail.messagingengine.com (Postfix) with ESMTPA id 69ED5102D6; Fri, 28 Sep 2018 12:40:48 -0400 (EDT) From: Thomas Monjalon To: dev@dpdk.org Cc: gaetan.rivet@6wind.com, ophirmu@mellanox.com, qi.z.zhang@intel.com, ferruh.yigit@intel.com Date: Fri, 28 Sep 2018 18:40:39 +0200 Message-Id: <20180928164039.2380-4-thomas@monjalon.net> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180928164039.2380-1-thomas@monjalon.net> References: <20180907230958.21402-1-thomas@monjalon.net> <20180928164039.2380-1-thomas@monjalon.net> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 3/3] eal: allow probing a device again 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" In the devargs syntax for device representors, it is possible to add several devices at once: -w dbdf,representor=[0-3] It will become a more frequent case when introducing wildcards and ranges in the new devargs syntax. If a devargs string is provided for probing, and updated with a bigger range for a new probing, then we do not want it to fail because part of this range was already probed previously. There can be new ports to create from an existing rte_device. That's why the checks for an already probed device are moved as PMD responsibility. Only the PMD knows the ports attached to one rte_device. In the case of vdev, a global check is kept in insert_vdev(), assuming that a vdev will always have only one port. In the case of NXP buses, the probing is done only once (no hotplug), though a check is added at bus level for consistency. As another consequence of being able to probe in several steps, the field rte_device.devargs must not be considered as a full representation of the rte_device, but only the latest probing args. Anyway, the field rte_device.devargs is used only for probing. Signed-off-by: Thomas Monjalon --- drivers/bus/dpaa/dpaa_bus.c | 3 +++ drivers/bus/fslmc/fslmc_bus.c | 3 +++ drivers/bus/ifpga/ifpga_bus.c | 13 ++++++----- drivers/bus/pci/pci_common.c | 15 +++++++------ drivers/bus/vdev/vdev.c | 5 +++++ drivers/bus/vmbus/vmbus_common.c | 25 +++++++++++----------- drivers/common/qat/Makefile | 3 ++- drivers/common/qat/meson.build | 1 + drivers/common/qat/qat_device.c | 3 +++ drivers/compress/octeontx/otx_zip_pmd.c | 3 +++ drivers/crypto/virtio/Makefile | 1 + drivers/crypto/virtio/meson.build | 1 + drivers/crypto/virtio/virtio_cryptodev.c | 3 +++ drivers/event/octeontx/ssovf_probe.c | 6 ++++++ drivers/event/skeleton/Makefile | 1 + drivers/event/skeleton/meson.build | 1 + drivers/mempool/octeontx/Makefile | 1 + drivers/mempool/octeontx/meson.build | 2 ++ drivers/mempool/octeontx/octeontx_fpavf.c | 3 +++ drivers/net/ark/Makefile | 1 + drivers/net/ark/meson.build | 1 + drivers/net/avf/Makefile | 1 + drivers/net/avp/Makefile | 1 + drivers/net/avp/meson.build | 1 + drivers/net/axgbe/Makefile | 1 + drivers/net/axgbe/meson.build | 2 ++ drivers/net/bnx2x/Makefile | 1 + drivers/net/bnx2x/meson.build | 1 + drivers/net/bnxt/Makefile | 1 + drivers/net/bnxt/meson.build | 1 + drivers/net/cxgbe/Makefile | 1 + drivers/net/cxgbe/meson.build | 2 ++ drivers/net/e1000/Makefile | 1 + drivers/net/e1000/meson.build | 2 ++ drivers/net/enic/Makefile | 1 + drivers/net/enic/meson.build | 2 ++ drivers/net/fm10k/Makefile | 1 + drivers/net/fm10k/meson.build | 2 ++ drivers/net/i40e/i40e_ethdev.c | 3 +++ drivers/net/ifc/ifcvf_vdpa.c | 3 +++ drivers/net/ixgbe/ixgbe_ethdev.c | 3 +++ drivers/net/liquidio/Makefile | 1 + drivers/net/liquidio/meson.build | 1 + drivers/net/mlx4/mlx4.c | 4 ++++ drivers/net/mlx5/mlx5.c | 4 ++++ drivers/net/netvsc/hn_ethdev.c | 9 +++++--- drivers/net/nfp/Makefile | 1 + drivers/net/nfp/meson.build | 1 + drivers/net/nfp/nfp_net.c | 3 +++ drivers/net/octeontx/Makefile | 3 +-- drivers/net/octeontx/base/meson.build | 2 +- drivers/net/octeontx/base/octeontx_pkivf.c | 3 +++ drivers/net/octeontx/base/octeontx_pkovf.c | 3 +++ drivers/net/qede/Makefile | 1 + drivers/net/qede/meson.build | 2 ++ drivers/net/szedata2/Makefile | 1 + drivers/net/szedata2/meson.build | 1 + drivers/net/szedata2/rte_eth_szedata2.c | 3 +++ drivers/net/thunderx/Makefile | 1 + drivers/net/thunderx/meson.build | 2 ++ drivers/raw/ifpga_rawdev/ifpga_rawdev.c | 3 +++ lib/librte_eal/common/eal_common_dev.c | 5 ----- lib/librte_eal/common/include/rte_dev.h | 2 +- lib/librte_ethdev/rte_ethdev_pci.h | 3 +++ lib/librte_eventdev/rte_eventdev_pmd_pci.h | 3 +++ 65 files changed, 152 insertions(+), 36 deletions(-) diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c index 49cd04dbb..5be9da0fa 100644 --- a/drivers/bus/dpaa/dpaa_bus.c +++ b/drivers/bus/dpaa/dpaa_bus.c @@ -553,6 +553,9 @@ rte_dpaa_bus_probe(void) if (ret) continue; + if (rte_dev_is_probed(&dev->device)) + continue; + if (!drv->probe || (dev->device.devargs && dev->device.devargs->policy == RTE_DEV_BLACKLISTED)) diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c index bfe81e236..9011eb74c 100644 --- a/drivers/bus/fslmc/fslmc_bus.c +++ b/drivers/bus/fslmc/fslmc_bus.c @@ -384,6 +384,9 @@ rte_fslmc_probe(void) if (!drv->probe) continue; + if (rte_dev_is_probed(&dev->device)) + continue; + if (dev->device.devargs && dev->device.devargs->policy == RTE_DEV_BLACKLISTED) { DPAA2_BUS_LOG(DEBUG, "%s Blacklisted, skipping", diff --git a/drivers/bus/ifpga/ifpga_bus.c b/drivers/bus/ifpga/ifpga_bus.c index 5ce886d13..a10f54f7b 100644 --- a/drivers/bus/ifpga/ifpga_bus.c +++ b/drivers/bus/ifpga/ifpga_bus.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -272,16 +273,22 @@ ifpga_probe_one_driver(struct rte_afu_driver *drv, struct rte_afu_device *afu_dev) { int ret; + bool already_probed; if (!rte_afu_match(drv, afu_dev)) /* Match of device and driver failed */ return 1; + already_probed = rte_dev_is_probed(&afu_dev->device); + /* reference driver structure */ - afu_dev->driver = drv; + if (!already_probed) + afu_dev->driver = drv; /* call the driver probe() function */ ret = drv->probe(afu_dev); + if (already_probed) + return ret; /* no rollback if already succeeded earlier */ if (ret) afu_dev->driver = NULL; else @@ -299,10 +306,6 @@ ifpga_probe_all_drivers(struct rte_afu_device *afu_dev) if (afu_dev == NULL) return -1; - /* Check if a driver is already loaded */ - if (rte_dev_is_probed(&afu_dev->device)) - return 0; - TAILQ_FOREACH(drv, &ifpga_afu_drv_list, next) { if (ifpga_probe_one_driver(drv, afu_dev)) { ret = -1; diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index d95410e19..46f65b415 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -123,6 +124,7 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *dev) { int ret; + bool already_probed; struct rte_pci_addr *loc; if ((dr == NULL) || (dev == NULL)) @@ -153,6 +155,8 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr, dev->device.numa_node = 0; } + already_probed = rte_dev_is_probed(&dev->device); + RTE_LOG(INFO, EAL, " probe driver: %x:%x %s\n", dev->id.vendor_id, dev->id.device_id, dr->driver.name); @@ -161,9 +165,10 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr, * This needs to be before rte_pci_map_device(), as it enables to use * driver flags for adjusting configuration. */ - dev->driver = dr; + if (!already_probed) + dev->driver = dr; - if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) { + if (!already_probed && (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING)) { /* map resources for devices that use igb_uio */ ret = rte_pci_map_device(dev); if (ret != 0) { @@ -174,6 +179,8 @@ rte_pci_probe_one_driver(struct rte_pci_driver *dr, /* call the driver probe() function */ ret = dr->probe(dr, dev); + if (already_probed) + return ret; /* no rollback if already succeeded earlier */ if (ret) { dev->driver = NULL; if ((dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) && @@ -244,10 +251,6 @@ pci_probe_all_drivers(struct rte_pci_device *dev) if (dev == NULL) return -1; - /* Check if a driver is already loaded */ - if (rte_dev_is_probed(&dev->device)) - return 0; - FOREACH_DRIVER_ON_PCIBUS(dr) { rc = rte_pci_probe_one_driver(dr, dev); if (rc < 0) diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c index 514d9d5c6..05a006d15 100644 --- a/drivers/bus/vdev/vdev.c +++ b/drivers/bus/vdev/vdev.c @@ -225,6 +225,11 @@ insert_vdev(const char *name, const char *args, struct rte_vdev_device **p_dev) dev->device.name = devargs->name; if (find_vdev(name)) { + /* + * A vdev is expected to have only one port. + * So there is no reason to try probing again, + * even with new arguments. + */ ret = -EEXIST; goto fail; } diff --git a/drivers/bus/vmbus/vmbus_common.c b/drivers/bus/vmbus/vmbus_common.c index 48a219f73..eff5c01f5 100644 --- a/drivers/bus/vmbus/vmbus_common.c +++ b/drivers/bus/vmbus/vmbus_common.c @@ -3,6 +3,7 @@ * All Rights Reserved. */ +#include #include #include #include @@ -93,6 +94,7 @@ vmbus_probe_one_driver(struct rte_vmbus_driver *dr, struct rte_vmbus_device *dev) { char guid[RTE_UUID_STRLEN]; + bool already_probed; int ret; if (!vmbus_match(dr, dev)) @@ -104,13 +106,16 @@ vmbus_probe_one_driver(struct rte_vmbus_driver *dr, /* TODO add blacklisted */ - /* map resources for device */ - ret = rte_vmbus_map_device(dev); - if (ret != 0) - return ret; + already_probed = rte_dev_is_probed(&dev->device); + if (!already_probed) { + /* map resources for device */ + ret = rte_vmbus_map_device(dev); + if (ret != 0) + return ret; - /* reference driver structure */ - dev->driver = dr; + /* reference driver structure */ + dev->driver = dr; + } if (dev->device.numa_node < 0) { VMBUS_LOG(WARNING, " Invalid NUMA socket, default to 0"); @@ -120,6 +125,8 @@ vmbus_probe_one_driver(struct rte_vmbus_driver *dr, /* call the driver probe() function */ VMBUS_LOG(INFO, " probe driver: %s", dr->driver.name); ret = dr->probe(dr, dev); + if (already_probed) + return ret; /* no rollback if already succeeded earlier */ if (ret) { dev->driver = NULL; rte_vmbus_unmap_device(dev); @@ -142,12 +149,6 @@ vmbus_probe_all_drivers(struct rte_vmbus_device *dev) struct rte_vmbus_driver *dr; int rc; - /* Check if a driver is already loaded */ - if (rte_dev_is_probed(&dev->device)) { - VMBUS_LOG(DEBUG, "VMBUS driver already loaded"); - return 0; - } - FOREACH_DRIVER_ON_VMBUS(dr) { rc = vmbus_probe_one_driver(dr, dev); if (rc < 0) /* negative is an error */ diff --git a/drivers/common/qat/Makefile b/drivers/common/qat/Makefile index c68a032a5..294da4927 100644 --- a/drivers/common/qat/Makefile +++ b/drivers/common/qat/Makefile @@ -8,6 +8,8 @@ QAT_CRYPTO_DIR := $(RTE_SDK)/drivers/crypto/qat QAT_COMPRESS_DIR := $(RTE_SDK)/drivers/compress/qat VPATH=$(QAT_CRYPTO_DIR):$(QAT_COMPRESS_DIR) +CFLAGS += -DALLOW_EXPERIMENTAL_API + # external library include paths CFLAGS += -I$(SRCDIR)/qat_adf CFLAGS += -I$(SRCDIR) @@ -16,7 +18,6 @@ CFLAGS += -I$(QAT_COMPRESS_DIR) ifeq ($(CONFIG_RTE_LIBRTE_COMPRESSDEV),y) - CFLAGS += -DALLOW_EXPERIMENTAL_API LDLIBS += -lrte_compressdev SRCS-y += qat_comp.c SRCS-y += qat_comp_pmd.c diff --git a/drivers/common/qat/meson.build b/drivers/common/qat/meson.build index 80b6b25a8..584642917 100644 --- a/drivers/common/qat/meson.build +++ b/drivers/common/qat/meson.build @@ -12,3 +12,4 @@ qat_sources = files('qat_common.c', qat_includes = [include_directories('.', 'qat_adf')] qat_ext_deps = [] qat_cflags = [] +allow_experimental_apis = true diff --git a/drivers/common/qat/qat_device.c b/drivers/common/qat/qat_device.c index f32d72358..da33faa9e 100644 --- a/drivers/common/qat/qat_device.c +++ b/drivers/common/qat/qat_device.c @@ -194,6 +194,9 @@ static int qat_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, pci_dev->addr.devid, pci_dev->addr.function); + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + qat_pci_dev = qat_pci_device_allocate(pci_dev); if (qat_pci_dev == NULL) return -ENODEV; diff --git a/drivers/compress/octeontx/otx_zip_pmd.c b/drivers/compress/octeontx/otx_zip_pmd.c index 9d13f9331..9894bb97c 100644 --- a/drivers/compress/octeontx/otx_zip_pmd.c +++ b/drivers/compress/octeontx/otx_zip_pmd.c @@ -569,6 +569,9 @@ zip_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, (unsigned int)pci_dev->id.vendor_id, (unsigned int)pci_dev->id.device_id); + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + rte_pci_device_name(&pci_dev->addr, compressdev_name, sizeof(compressdev_name)); diff --git a/drivers/crypto/virtio/Makefile b/drivers/crypto/virtio/Makefile index be7b828fe..26c4edc2c 100644 --- a/drivers/crypto/virtio/Makefile +++ b/drivers/crypto/virtio/Makefile @@ -14,6 +14,7 @@ LIB = librte_pmd_virtio_crypto.a CFLAGS += -I$(RTE_SDK)/lib/librte_vhost CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API EXPORT_MAP := rte_pmd_virtio_crypto_version.map diff --git a/drivers/crypto/virtio/meson.build b/drivers/crypto/virtio/meson.build index b15b3f9fa..cb7b5ab99 100644 --- a/drivers/crypto/virtio/meson.build +++ b/drivers/crypto/virtio/meson.build @@ -6,3 +6,4 @@ deps += 'bus_pci' name = 'virtio_crypto' sources = files('virtio_cryptodev.c', 'virtio_pci.c', 'virtio_rxtx.c', 'virtqueue.c') +allow_experimental_apis = true diff --git a/drivers/crypto/virtio/virtio_cryptodev.c b/drivers/crypto/virtio/virtio_cryptodev.c index 568b5a406..f0fb2fe1e 100644 --- a/drivers/crypto/virtio/virtio_cryptodev.c +++ b/drivers/crypto/virtio/virtio_cryptodev.c @@ -1439,6 +1439,9 @@ crypto_virtio_pci_probe( pci_dev->addr.devid, pci_dev->addr.function); + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + rte_pci_device_name(&pci_dev->addr, name, sizeof(name)); return crypto_virtio_create(name, pci_dev, &init_params); diff --git a/drivers/event/octeontx/ssovf_probe.c b/drivers/event/octeontx/ssovf_probe.c index b3db596d4..602012024 100644 --- a/drivers/event/octeontx/ssovf_probe.c +++ b/drivers/event/octeontx/ssovf_probe.c @@ -150,6 +150,9 @@ ssowvf_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev) if (rte_eal_process_type() != RTE_PROC_PRIMARY) return 0; + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + if (pci_dev->mem_resource[0].addr == NULL || pci_dev->mem_resource[2].addr == NULL || pci_dev->mem_resource[4].addr == NULL) { @@ -230,6 +233,9 @@ ssovf_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev) if (rte_eal_process_type() != RTE_PROC_PRIMARY) return 0; + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + if (pci_dev->mem_resource[0].addr == NULL || pci_dev->mem_resource[2].addr == NULL) { mbox_log_err("Empty bars %p %p", diff --git a/drivers/event/skeleton/Makefile b/drivers/event/skeleton/Makefile index 0f7f07eaf..fd75b1dd6 100644 --- a/drivers/event/skeleton/Makefile +++ b/drivers/event/skeleton/Makefile @@ -9,6 +9,7 @@ include $(RTE_SDK)/mk/rte.vars.mk # LIB = librte_pmd_skeleton_event.a +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += $(WERROR_FLAGS) LDLIBS += -lrte_eal -lrte_eventdev LDLIBS += -lrte_pci -lrte_bus_pci diff --git a/drivers/event/skeleton/meson.build b/drivers/event/skeleton/meson.build index acfe15653..773bed4ae 100644 --- a/drivers/event/skeleton/meson.build +++ b/drivers/event/skeleton/meson.build @@ -3,3 +3,4 @@ sources = files('skeleton_eventdev.c') deps += ['bus_pci', 'bus_vdev'] +allow_experimental_apis = true diff --git a/drivers/mempool/octeontx/Makefile b/drivers/mempool/octeontx/Makefile index a3e1dce88..b9c9e0268 100644 --- a/drivers/mempool/octeontx/Makefile +++ b/drivers/mempool/octeontx/Makefile @@ -9,6 +9,7 @@ include $(RTE_SDK)/mk/rte.vars.mk # LIB = librte_mempool_octeontx.a +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += $(WERROR_FLAGS) CFLAGS += -I$(RTE_SDK)/drivers/common/octeontx/ EXPORT_MAP := rte_mempool_octeontx_version.map diff --git a/drivers/mempool/octeontx/meson.build b/drivers/mempool/octeontx/meson.build index 3baaf7db2..cdf5bbe24 100644 --- a/drivers/mempool/octeontx/meson.build +++ b/drivers/mempool/octeontx/meson.build @@ -5,4 +5,6 @@ sources = files('octeontx_fpavf.c', 'rte_mempool_octeontx.c' ) +allow_experimental_apis = true + deps += ['mbuf', 'bus_pci', 'common_octeontx'] diff --git a/drivers/mempool/octeontx/octeontx_fpavf.c b/drivers/mempool/octeontx/octeontx_fpavf.c index 4cf387e8f..a9998f8c3 100644 --- a/drivers/mempool/octeontx/octeontx_fpavf.c +++ b/drivers/mempool/octeontx/octeontx_fpavf.c @@ -764,6 +764,9 @@ fpavf_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev) if (rte_eal_process_type() != RTE_PROC_PRIMARY) return 0; + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + if (pci_dev->mem_resource[0].addr == NULL) { fpavf_log_err("Empty bars %p ", pci_dev->mem_resource[0].addr); return -ENODEV; diff --git a/drivers/net/ark/Makefile b/drivers/net/ark/Makefile index 2e232be85..a873a774a 100644 --- a/drivers/net/ark/Makefile +++ b/drivers/net/ark/Makefile @@ -8,6 +8,7 @@ include $(RTE_SDK)/mk/rte.vars.mk # LIB = librte_pmd_ark.a +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 -I./ CFLAGS += $(WERROR_FLAGS) -Werror diff --git a/drivers/net/ark/meson.build b/drivers/net/ark/meson.build index 99151bba1..a5886cd01 100644 --- a/drivers/net/ark/meson.build +++ b/drivers/net/ark/meson.build @@ -11,3 +11,4 @@ sources = files('ark_ddm.c', 'ark_pktgen.c', 'ark_rqp.c', 'ark_udm.c') +allow_experimental_apis = true diff --git a/drivers/net/avf/Makefile b/drivers/net/avf/Makefile index 3f815bbc4..fec88ea38 100644 --- a/drivers/net/avf/Makefile +++ b/drivers/net/avf/Makefile @@ -8,6 +8,7 @@ include $(RTE_SDK)/mk/rte.vars.mk # LIB = librte_pmd_avf.a +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring LDLIBS += -lrte_ethdev -lrte_net -lrte_kvargs -lrte_hash diff --git a/drivers/net/avp/Makefile b/drivers/net/avp/Makefile index c9db667f3..6fcdc05f5 100644 --- a/drivers/net/avp/Makefile +++ b/drivers/net/avp/Makefile @@ -8,6 +8,7 @@ include $(RTE_SDK)/mk/rte.vars.mk # LIB = librte_pmd_avp.a +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring diff --git a/drivers/net/avp/meson.build b/drivers/net/avp/meson.build index 6076c31b9..4c282ebe2 100644 --- a/drivers/net/avp/meson.build +++ b/drivers/net/avp/meson.build @@ -3,3 +3,4 @@ sources = files('avp_ethdev.c') install_headers('rte_avp_common.h', 'rte_avp_fifo.h') +allow_experimental_apis = true diff --git a/drivers/net/axgbe/Makefile b/drivers/net/axgbe/Makefile index 72215aeda..1bc0412b4 100644 --- a/drivers/net/axgbe/Makefile +++ b/drivers/net/axgbe/Makefile @@ -8,6 +8,7 @@ include $(RTE_SDK)/mk/rte.vars.mk # LIB = librte_pmd_axgbe.a +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) diff --git a/drivers/net/axgbe/meson.build b/drivers/net/axgbe/meson.build index 548ffff7a..c865b739f 100644 --- a/drivers/net/axgbe/meson.build +++ b/drivers/net/axgbe/meson.build @@ -17,3 +17,5 @@ cflags += '-Wno-cast-qual' if arch_subdir == 'x86' sources += files('axgbe_rxtx_vec_sse.c') endif + +allow_experimental_apis = true diff --git a/drivers/net/bnx2x/Makefile b/drivers/net/bnx2x/Makefile index 55d1ad6e0..82ad0ead9 100644 --- a/drivers/net/bnx2x/Makefile +++ b/drivers/net/bnx2x/Makefile @@ -9,6 +9,7 @@ include $(RTE_SDK)/mk/rte.vars.mk # LIB = librte_pmd_bnx2x.a +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) CFLAGS += -DZLIB_CONST diff --git a/drivers/net/bnx2x/meson.build b/drivers/net/bnx2x/meson.build index e3c688869..734499ceb 100644 --- a/drivers/net/bnx2x/meson.build +++ b/drivers/net/bnx2x/meson.build @@ -12,3 +12,4 @@ sources = files('bnx2x.c', 'bnx2x_vfpf.c', 'ecore_sp.c', 'elink.c') +allow_experimental_apis = true diff --git a/drivers/net/bnxt/Makefile b/drivers/net/bnxt/Makefile index 8be3cb0e4..ce84ec64d 100644 --- a/drivers/net/bnxt/Makefile +++ b/drivers/net/bnxt/Makefile @@ -15,6 +15,7 @@ EXPORT_MAP := rte_pmd_bnxt_version.map LIBABIVER := 2 +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring diff --git a/drivers/net/bnxt/meson.build b/drivers/net/bnxt/meson.build index e130f2712..d1f50cb6d 100644 --- a/drivers/net/bnxt/meson.build +++ b/drivers/net/bnxt/meson.build @@ -18,3 +18,4 @@ sources = files('bnxt_cpr.c', 'bnxt_util.c', 'bnxt_vnic.c', 'rte_pmd_bnxt.c') +allow_experimental_apis = true diff --git a/drivers/net/cxgbe/Makefile b/drivers/net/cxgbe/Makefile index 68466f13e..36388a746 100644 --- a/drivers/net/cxgbe/Makefile +++ b/drivers/net/cxgbe/Makefile @@ -13,6 +13,7 @@ CFLAGS += -I$(SRCDIR)/base/ CFLAGS += -I$(SRCDIR) CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API EXPORT_MAP := rte_pmd_cxgbe_version.map diff --git a/drivers/net/cxgbe/meson.build b/drivers/net/cxgbe/meson.build index c51af26e9..d8c3b9e5c 100644 --- a/drivers/net/cxgbe/meson.build +++ b/drivers/net/cxgbe/meson.build @@ -14,3 +14,5 @@ sources = files('cxgbe_ethdev.c', 'base/t4_hw.c', 'base/t4vf_hw.c') includes += include_directories('base') + +allow_experimental_apis = true diff --git a/drivers/net/e1000/Makefile b/drivers/net/e1000/Makefile index 9c87e883b..825234dc8 100644 --- a/drivers/net/e1000/Makefile +++ b/drivers/net/e1000/Makefile @@ -8,6 +8,7 @@ include $(RTE_SDK)/mk/rte.vars.mk # LIB = librte_pmd_e1000.a +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring diff --git a/drivers/net/e1000/meson.build b/drivers/net/e1000/meson.build index cf456995c..997013de3 100644 --- a/drivers/net/e1000/meson.build +++ b/drivers/net/e1000/meson.build @@ -15,3 +15,5 @@ sources = files( ) includes += include_directories('base') + +allow_experimental_apis = true diff --git a/drivers/net/enic/Makefile b/drivers/net/enic/Makefile index 7c6c29cc0..bebed0dd5 100644 --- a/drivers/net/enic/Makefile +++ b/drivers/net/enic/Makefile @@ -13,6 +13,7 @@ EXPORT_MAP := rte_pmd_enic_version.map LIBABIVER := 1 +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -I$(SRCDIR)/base/ CFLAGS += -I$(SRCDIR) CFLAGS += -O3 diff --git a/drivers/net/enic/meson.build b/drivers/net/enic/meson.build index bfd4e2373..4df6bd457 100644 --- a/drivers/net/enic/meson.build +++ b/drivers/net/enic/meson.build @@ -17,3 +17,5 @@ sources = files( ) deps += ['hash'] includes += include_directories('base') + +allow_experimental_apis = true diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile index d657dff8a..a53a3ece6 100644 --- a/drivers/net/fm10k/Makefile +++ b/drivers/net/fm10k/Makefile @@ -8,6 +8,7 @@ include $(RTE_SDK)/mk/rte.vars.mk # LIB = librte_pmd_fm10k.a +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) diff --git a/drivers/net/fm10k/meson.build b/drivers/net/fm10k/meson.build index 2772ea4df..a99aecfa7 100644 --- a/drivers/net/fm10k/meson.build +++ b/drivers/net/fm10k/meson.build @@ -14,3 +14,5 @@ if arch_subdir == 'x86' endif includes += include_directories('base') + +allow_experimental_apis = true diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 24d73f2ff..67f29f282 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -633,6 +633,9 @@ eth_i40e_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_eth_devargs eth_da = { .nb_representor_ports = 0 }; int i, retval; + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + if (pci_dev->device.devargs) { retval = rte_eth_devargs_parse(pci_dev->device.devargs->args, ð_da); diff --git a/drivers/net/ifc/ifcvf_vdpa.c b/drivers/net/ifc/ifcvf_vdpa.c index 88d814037..192368395 100644 --- a/drivers/net/ifc/ifcvf_vdpa.c +++ b/drivers/net/ifc/ifcvf_vdpa.c @@ -682,6 +682,9 @@ ifcvf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, if (rte_eal_process_type() != RTE_PROC_PRIMARY) return 0; + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + list = rte_zmalloc("ifcvf", sizeof(*list), 0); if (list == NULL) goto error; diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index cee886754..8a6d5f972 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -1735,6 +1735,9 @@ eth_ixgbe_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_eth_devargs eth_da; int i, retval; + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + if (pci_dev->device.devargs) { retval = rte_eth_devargs_parse(pci_dev->device.devargs->args, ð_da); diff --git a/drivers/net/liquidio/Makefile b/drivers/net/liquidio/Makefile index f1092851a..19a9f8fe6 100644 --- a/drivers/net/liquidio/Makefile +++ b/drivers/net/liquidio/Makefile @@ -9,6 +9,7 @@ include $(RTE_SDK)/mk/rte.vars.mk # LIB = librte_pmd_lio.a +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)/base -I$(SRCDIR) LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring diff --git a/drivers/net/liquidio/meson.build b/drivers/net/liquidio/meson.build index 9ae48e213..091114349 100644 --- a/drivers/net/liquidio/meson.build +++ b/drivers/net/liquidio/meson.build @@ -6,3 +6,4 @@ sources = files('base/lio_23xx_vf.c', 'lio_ethdev.c', 'lio_rxtx.c') includes += include_directories('base') +allow_experimental_apis = true diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index 3de7bc53e..c3acb469a 100644 --- a/drivers/net/mlx4/mlx4.c +++ b/drivers/net/mlx4/mlx4.c @@ -523,6 +523,10 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev) (void)pci_drv; assert(pci_drv == &mlx4_driver); + + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + list = mlx4_glue->get_device_list(&i); if (list == NULL) { rte_errno = errno; diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index f5f3a3d19..b488910a8 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -1296,6 +1296,10 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, assert(pci_drv == &mlx5_driver); errno = 0; + + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + ibv_list = mlx5_glue->get_device_list(&ret); if (!ibv_list) { rte_errno = errno ? errno : ENOSYS; diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c index b67cce1ba..991a1a91a 100644 --- a/drivers/net/netvsc/hn_ethdev.c +++ b/drivers/net/netvsc/hn_ethdev.c @@ -75,9 +75,6 @@ eth_dev_vmbus_allocate(struct rte_vmbus_device *dev, size_t private_data_size) struct rte_eth_dev *eth_dev; const char *name; - if (!dev) - return NULL; - name = dev->device.name; if (rte_eal_process_type() == RTE_PROC_PRIMARY) { @@ -824,6 +821,12 @@ static int eth_hn_probe(struct rte_vmbus_driver *drv __rte_unused, PMD_INIT_FUNC_TRACE(); + if (!dev) + return -EINVAL; + + if (rte_dev_is_probed(&dev->device)) + return -EEXIST; + eth_dev = eth_dev_vmbus_allocate(dev, sizeof(struct hn_data)); if (!eth_dev) return -ENOMEM; diff --git a/drivers/net/nfp/Makefile b/drivers/net/nfp/Makefile index ab4e0a7d9..0188144da 100644 --- a/drivers/net/nfp/Makefile +++ b/drivers/net/nfp/Makefile @@ -8,6 +8,7 @@ include $(RTE_SDK)/mk/rte.vars.mk # LIB = librte_pmd_nfp.a +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) diff --git a/drivers/net/nfp/meson.build b/drivers/net/nfp/meson.build index 3ba37e279..1cae381fa 100644 --- a/drivers/net/nfp/meson.build +++ b/drivers/net/nfp/meson.build @@ -14,3 +14,4 @@ sources = files('nfpcore/nfp_cpp_pcie_ops.c', 'nfpcore/nfp_nsp_eth.c', 'nfpcore/nfp_hwinfo.c', 'nfp_net.c') +allow_experimental_apis = true diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c index 168088c6d..c9438f655 100644 --- a/drivers/net/nfp/nfp_net.c +++ b/drivers/net/nfp/nfp_net.c @@ -3121,6 +3121,9 @@ static int nfp_pf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, if (!dev) return ret; + if (rte_dev_is_probed(&dev->device)) + return -EEXIST; + /* * When device bound to UIO, the device could be used, by mistake, * by two DPDK apps, and the UIO driver does not avoid it. This diff --git a/drivers/net/octeontx/Makefile b/drivers/net/octeontx/Makefile index 885f17684..060ba873d 100644 --- a/drivers/net/octeontx/Makefile +++ b/drivers/net/octeontx/Makefile @@ -9,6 +9,7 @@ include $(RTE_SDK)/mk/rte.vars.mk # LIB = librte_pmd_octeontx.a +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += $(WERROR_FLAGS) CFLAGS += -I$(RTE_SDK)/drivers/common/octeontx/ CFLAGS += -I$(RTE_SDK)/drivers/mempool/octeontx/ @@ -44,8 +45,6 @@ else CFLAGS_octeontx_rxtx.o += -O3 -Ofast endif -CFLAGS_octeontx_ethdev.o += -DALLOW_EXPERIMENTAL_API - LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring LDLIBS += -lrte_ethdev -lrte_net -lrte_kvargs -lrte_common_octeontx LDLIBS += -lrte_mempool_octeontx diff --git a/drivers/net/octeontx/base/meson.build b/drivers/net/octeontx/base/meson.build index 09f657abb..738164beb 100644 --- a/drivers/net/octeontx/base/meson.build +++ b/drivers/net/octeontx/base/meson.build @@ -14,7 +14,7 @@ foreach d: depends endforeach base_lib = static_library('octeontx_base', sources, - c_args: cflags, + c_args: cflags + ['-DALLOW_EXPERIMENTAL_API'], dependencies: static_objs, ) diff --git a/drivers/net/octeontx/base/octeontx_pkivf.c b/drivers/net/octeontx/base/octeontx_pkivf.c index 1babea0e8..4c8a0a345 100644 --- a/drivers/net/octeontx/base/octeontx_pkivf.c +++ b/drivers/net/octeontx/base/octeontx_pkivf.c @@ -120,6 +120,9 @@ pkivf_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev) if (rte_eal_process_type() != RTE_PROC_PRIMARY) return 0; + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + return 0; } diff --git a/drivers/net/octeontx/base/octeontx_pkovf.c b/drivers/net/octeontx/base/octeontx_pkovf.c index 0a6d64b8e..19b1f3c65 100644 --- a/drivers/net/octeontx/base/octeontx_pkovf.c +++ b/drivers/net/octeontx/base/octeontx_pkovf.c @@ -536,6 +536,9 @@ pkovf_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev) if (rte_eal_process_type() != RTE_PROC_PRIMARY) return 0; + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + if (pci_dev->mem_resource[0].addr == NULL || pci_dev->mem_resource[2].addr == NULL) { octeontx_log_err("Empty bars %p %p", diff --git a/drivers/net/qede/Makefile b/drivers/net/qede/Makefile index 488ca1d92..455f076f9 100644 --- a/drivers/net/qede/Makefile +++ b/drivers/net/qede/Makefile @@ -10,6 +10,7 @@ include $(RTE_SDK)/mk/rte.vars.mk # LIB = librte_pmd_qede.a +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring diff --git a/drivers/net/qede/meson.build b/drivers/net/qede/meson.build index 6280073a5..1978c0b51 100644 --- a/drivers/net/qede/meson.build +++ b/drivers/net/qede/meson.build @@ -10,3 +10,5 @@ sources = files( 'qede_main.c', 'qede_rxtx.c', ) + +allow_experimental_apis = true diff --git a/drivers/net/szedata2/Makefile b/drivers/net/szedata2/Makefile index b77fae16d..6a9198bfd 100644 --- a/drivers/net/szedata2/Makefile +++ b/drivers/net/szedata2/Makefile @@ -8,6 +8,7 @@ include $(RTE_SDK)/mk/rte.vars.mk # LIB = librte_pmd_szedata2.a +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) LDLIBS += -lsze2 diff --git a/drivers/net/szedata2/meson.build b/drivers/net/szedata2/meson.build index da3733743..157b32e15 100644 --- a/drivers/net/szedata2/meson.build +++ b/drivers/net/szedata2/meson.build @@ -5,3 +5,4 @@ dep = cc.find_library('sze2', required: false) build = dep.found() ext_deps += dep sources = files('rte_eth_szedata2.c') +allow_experimental_apis = true diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c index 8f92e72f2..0adc0ff4c 100644 --- a/drivers/net/szedata2/rte_eth_szedata2.c +++ b/drivers/net/szedata2/rte_eth_szedata2.c @@ -1804,6 +1804,9 @@ static int szedata2_eth_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, PMD_INIT_FUNC_TRACE(); + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + ret = get_port_info(pci_dev, &port_count, port_info, SZEDATA2_MAX_PORTS); if (ret != 0) diff --git a/drivers/net/thunderx/Makefile b/drivers/net/thunderx/Makefile index e6bf49752..c08ef9277 100644 --- a/drivers/net/thunderx/Makefile +++ b/drivers/net/thunderx/Makefile @@ -9,6 +9,7 @@ include $(RTE_SDK)/mk/rte.vars.mk # LIB = librte_pmd_thunderx_nicvf.a +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += $(WERROR_FLAGS) LDLIBS += -lm diff --git a/drivers/net/thunderx/meson.build b/drivers/net/thunderx/meson.build index 69819a97f..bcba1489f 100644 --- a/drivers/net/thunderx/meson.build +++ b/drivers/net/thunderx/meson.build @@ -18,3 +18,5 @@ if cc.has_argument('-Wno-maybe-uninitialized') endif includes += include_directories('base') + +allow_experimental_apis = true diff --git a/drivers/raw/ifpga_rawdev/ifpga_rawdev.c b/drivers/raw/ifpga_rawdev/ifpga_rawdev.c index 3fed05781..cfaa0d39e 100644 --- a/drivers/raw/ifpga_rawdev/ifpga_rawdev.c +++ b/drivers/raw/ifpga_rawdev/ifpga_rawdev.c @@ -378,6 +378,9 @@ ifpga_rawdev_create(struct rte_pci_device *pci_dev, goto cleanup; } + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + memset(name, 0, sizeof(name)); snprintf(name, RTE_RAWDEV_NAME_MAX_LEN, "IFPGA:%x:%02x.%x", pci_dev->addr.bus, pci_dev->addr.devid, pci_dev->addr.function); diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c index 907c5c481..cbd7a3419 100644 --- a/lib/librte_eal/common/eal_common_dev.c +++ b/lib/librte_eal/common/eal_common_dev.c @@ -191,11 +191,6 @@ rte_dev_probe(const char *devargs) goto err_devarg; } - if (rte_dev_is_probed(dev)) { - RTE_LOG(ERR, EAL, "Device is already plugged\n"); - return -EEXIST; - } - ret = da->bus->plug(dev); if (ret) { RTE_LOG(ERR, EAL, "Driver cannot attach the device (%s)\n", diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h index 5b16ee27b..6ba16f8b3 100644 --- a/lib/librte_eal/common/include/rte_dev.h +++ b/lib/librte_eal/common/include/rte_dev.h @@ -158,7 +158,7 @@ struct rte_device { const char *name; /**< Device name */ const struct rte_driver *driver; /**< Driver associated after probing */ int numa_node; /**< NUMA node connection */ - struct rte_devargs *devargs; /**< Device user arguments */ + struct rte_devargs *devargs; /**< Arguments for latest probing */ }; /** diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h index f652596f4..4080fa6f5 100644 --- a/lib/librte_ethdev/rte_ethdev_pci.h +++ b/lib/librte_ethdev/rte_ethdev_pci.h @@ -167,6 +167,9 @@ rte_eth_dev_pci_generic_probe(struct rte_pci_device *pci_dev, struct rte_eth_dev *eth_dev; int ret; + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + eth_dev = rte_eth_dev_pci_allocate(pci_dev, private_data_size); if (!eth_dev) return -ENOMEM; diff --git a/lib/librte_eventdev/rte_eventdev_pmd_pci.h b/lib/librte_eventdev/rte_eventdev_pmd_pci.h index 8fb61386f..97fa2cc97 100644 --- a/lib/librte_eventdev/rte_eventdev_pmd_pci.h +++ b/lib/librte_eventdev/rte_eventdev_pmd_pci.h @@ -50,6 +50,9 @@ rte_event_pmd_pci_probe(struct rte_pci_driver *pci_drv, if (devinit == NULL) return -EINVAL; + if (rte_dev_is_probed(&pci_dev->device)) + return -EEXIST; + rte_pci_device_name(&pci_dev->addr, eventdev_name, sizeof(eventdev_name));