pci: remove loop over drivers in device detach
authorShreyansh Jain <shreyansh.jain@nxp.com>
Tue, 11 Apr 2017 11:07:30 +0000 (13:07 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Fri, 14 Apr 2017 13:23:28 +0000 (15:23 +0200)
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.jain@nxp.com>
Reviewed-by: Gaetan Rivet <gaetan.rivet@6wind.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
lib/librte_eal/common/eal_common_pci.c

index 83a81c4..498a3bb 100644 (file)
@@ -263,19 +263,15 @@ 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)
 {
        struct rte_pci_addr *loc;
+       struct rte_pci_driver *dr;
 
-       if ((dr == NULL) || (dev == NULL))
+       if (dev == NULL)
                return -EINVAL;
 
-       if (!rte_pci_match(dr, dev)) {
-               /* Device and driver don't match */
-               return 1;
-       }
-
+       dr = dev->driver;
        loc = &dev->addr;
 
        RTE_LOG(DEBUG, EAL, "PCI device "PCI_PRI_FMT" on NUMA socket %i\n",
@@ -329,33 +325,6 @@ pci_probe_all_drivers(struct rte_pci_device *dev)
        return 1;
 }
 
-/*
- * 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.
@@ -409,9 +378,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);