rte_eal_pci_detach calls pci_detach_all_drivers which loops over all
PCI drivers for detaching the device. This is unnecessary as the device
already has the PCI driver reference which can be used directly.

Removing pci_detach_all_drivers and restructuring rte_eal_pci_detach
and rte_eal_pci_detach_dev to work without looping over driver list.

Signed-off-by: Shreyansh Jain <shreyansh.j...@nxp.com>
---
 lib/librte_eal/common/eal_common_pci.c | 41 +++++++++-------------------------
 1 file changed, 10 insertions(+), 31 deletions(-)

diff --git a/lib/librte_eal/common/eal_common_pci.c 
b/lib/librte_eal/common/eal_common_pci.c
index 4f155c6..7548ab0 100644
--- a/lib/librte_eal/common/eal_common_pci.c
+++ b/lib/librte_eal/common/eal_common_pci.c
@@ -259,15 +259,17 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr,
  * driver.
  */
 static int
-rte_eal_pci_detach_dev(struct rte_pci_driver *dr,
-               struct rte_pci_device *dev)
+rte_eal_pci_detach_dev(struct rte_pci_device *dev)
 {
        int ret;
        struct rte_pci_addr *loc;
+       struct rte_pci_driver *dr;
 
-       if ((dr == NULL) || (dev == NULL))
+       if ((dev == NULL))
                return -EINVAL;
 
+       dr = dev->driver;
+
        ret = rte_pci_match(dr, dev);
        if (ret) {
                /* Device and driver don't match */
@@ -328,33 +330,6 @@ pci_probe_all_drivers(struct rte_pci_device *dev)
 }
 
 /*
- * If vendor/device ID match, call the remove() function of all
- * registered driver for the given device. Return -1 if initialization
- * failed, return 1 if no driver is found for this device.
- */
-static int
-pci_detach_all_drivers(struct rte_pci_device *dev)
-{
-       struct rte_pci_driver *dr = NULL;
-       int rc = 0;
-
-       if (dev == NULL)
-               return -1;
-
-       TAILQ_FOREACH(dr, &pci_driver_list, next) {
-               rc = rte_eal_pci_detach_dev(dr, dev);
-               if (rc < 0)
-                       /* negative value is an error */
-                       return -1;
-               if (rc > 0)
-                       /* positive value means driver doesn't support it */
-                       continue;
-               return 0;
-       }
-       return 1;
-}
-
-/*
  * Find the pci device specified by pci address, then invoke probe function of
  * the driver of the devive.
  */
@@ -407,9 +382,13 @@ rte_eal_pci_detach(const struct rte_pci_addr *addr)
                if (rte_eal_compare_pci_addr(&dev->addr, addr))
                        continue;
 
-               ret = pci_detach_all_drivers(dev);
+               ret = rte_eal_pci_detach_dev(dev);
                if (ret < 0)
+                       /* negative value is an error */
                        goto err_return;
+               if (ret > 0)
+                       /* positive value means driver doesn't support it */
+                       continue;
 
                TAILQ_REMOVE(&pci_device_list, dev, next);
                free(dev);
-- 
2.7.4

Reply via email to