pci: do not log false failures for non-whitelisted devices
[dpdk.git] / lib / librte_eal / common / eal_common_pci.c
index 971ad20..1ab92c9 100644 (file)
@@ -69,6 +69,7 @@
 #include <sys/queue.h>
 #include <sys/mman.h>
 
+#include <rte_errno.h>
 #include <rte_interrupts.h>
 #include <rte_log.h>
 #include <rte_pci.h>
@@ -199,22 +200,24 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *d
                                dev->id.device_id, dr->driver.name);
 
                if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) {
-                       /* map resources for devices that use igb_uio */
+                       /* map resources for devices that use igb_uio or VFIO */
                        ret = rte_eal_pci_map_device(dev);
                        if (ret != 0)
                                return ret;
-               } else if (dr->drv_flags & RTE_PCI_DRV_FORCE_UNBIND &&
-                               rte_eal_process_type() == RTE_PROC_PRIMARY) {
-                       /* unbind current driver */
-                       if (pci_unbind_kernel_driver(dev) < 0)
-                               return -1;
                }
 
                /* reference driver structure */
                dev->driver = dr;
 
                /* call the driver probe() function */
-               return dr->probe(dr, dev);
+               ret = dr->probe(dr, dev);
+               if (ret) {
+                       dev->driver = NULL;
+                       if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING)
+                               rte_eal_pci_unmap_device(dev);
+               }
+
+               return ret;
        }
        /* return positive value if driver doesn't support this device */
        return 1;
@@ -357,7 +360,7 @@ rte_eal_pci_probe_one(const struct rte_pci_addr *addr)
                        continue;
 
                ret = pci_probe_all_drivers(dev);
-               if (ret < 0)
+               if (ret)
                        goto err_return;
                return 0;
        }
@@ -412,6 +415,7 @@ int
 rte_eal_pci_probe(void)
 {
        struct rte_pci_device *dev = NULL;
+       size_t probed = 0, failed = 0;
        struct rte_devargs *devargs;
        int probe_all = 0;
        int ret = 0;
@@ -420,6 +424,7 @@ rte_eal_pci_probe(void)
                probe_all = 1;
 
        TAILQ_FOREACH(dev, &pci_device_list, next) {
+               probed++;
 
                /* set devargs in PCI structure */
                devargs = pci_devargs_lookup(dev);
@@ -432,13 +437,17 @@ rte_eal_pci_probe(void)
                else if (devargs != NULL &&
                        devargs->type == RTE_DEVTYPE_WHITELISTED_PCI)
                        ret = pci_probe_all_drivers(dev);
-               if (ret < 0)
-                       rte_exit(EXIT_FAILURE, "Requested device " PCI_PRI_FMT
+               if (ret < 0) {
+                       RTE_LOG(ERR, EAL, "Requested device " PCI_PRI_FMT
                                 " cannot be used\n", dev->addr.domain, dev->addr.bus,
                                 dev->addr.devid, dev->addr.function);
+                       rte_errno = errno;
+                       failed++;
+                       ret = 0;
+               }
        }
 
-       return 0;
+       return (probed && probed == failed) ? -1 : 0;
 }
 
 /* dump one device */