]> git.droids-corp.org - dpdk.git/commitdiff
eal: do not panic on PCI failures
authorAaron Conole <aconole@redhat.com>
Wed, 22 Mar 2017 20:19:37 +0000 (16:19 -0400)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Mon, 27 Mar 2017 13:58:00 +0000 (15:58 +0200)
Some devices may be inaccessible for a variety of reasons, or the
PCI-bus may be unavailable causing the whole thing to fail.  Still,
better to continue attempts at probes.

Since PCI isn't neccessarily required, it may be possible to simply log
the error and continue on letting the user check the logs and restart
the application when things have failed.

This will usually be an issue because of permissions.  However, it could
also be caused by OOM.  In either case, errno will contain the
underlying cause.

For linux, it is safe to re-init the system here, so allow the
application to take corrective action and reinit.

For BSD, this is not the case, for other reasons, including hugepage
allocation has already happened, and needs to be properly uninitialized.

Signed-off-by: Aaron Conole <aconole@redhat.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
lib/librte_eal/bsdapp/eal/eal.c
lib/librte_eal/common/eal_common_pci.c
lib/librte_eal/linuxapp/eal/eal.c

index 14935aa36c4542a79a3a870a3d5d37541d358704..f94b1b4ebb828af817d0d499f7ffabea89c53e8a 100644 (file)
@@ -604,8 +604,12 @@ rte_eal_init(int argc, char **argv)
                return -1;
        }
 
-       if (rte_eal_pci_init() < 0)
-               rte_panic("Cannot init PCI\n");
+       if (rte_eal_pci_init() < 0) {
+               rte_eal_init_alert("Cannot init PCI\n");
+               rte_errno = EPROTO;
+               rte_atomic32_clear(&run_once);
+               return -1;
+       }
 
        eal_check_mem_on_local_socket();
 
@@ -660,8 +664,11 @@ rte_eal_init(int argc, char **argv)
                rte_panic("Cannot probe devices\n");
 
        /* Probe & Initialize PCI devices */
-       if (rte_eal_pci_probe())
-               rte_panic("Cannot probe PCI\n");
+       if (rte_eal_pci_probe()) {
+               rte_eal_init_alert("Cannot probe PCI\n");
+               rte_errno = ENOTSUP;
+               return -1;
+       }
 
        if (rte_eal_dev_init() < 0)
                rte_panic("Cannot init pmd devices\n");
index 72547bd28569c080af69b909f0797ffc51b4dd34..d45b7d3114f24419a217ea0dc44a77091bd7c669 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>
@@ -414,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;
@@ -422,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);
@@ -434,13 +437,16 @@ 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++;
+               }
        }
 
-       return 0;
+       return (probed && probed == failed) ? -1 : 0;
 }
 
 /* dump one device */
index b2a900525cfa122666e4c62e490cb1029a328161..354d0d80d369cbc985bf4b567122e9bd75db5b1d 100644 (file)
@@ -832,8 +832,12 @@ rte_eal_init(int argc, char **argv)
                return -1;
        }
 
-       if (rte_eal_pci_init() < 0)
-               rte_panic("Cannot init PCI\n");
+       if (rte_eal_pci_init() < 0) {
+               rte_eal_init_alert("Cannot init PCI\n");
+               rte_errno = EPROTO;
+               rte_atomic32_clear(&run_once);
+               return -1;
+       }
 
 #ifdef VFIO_PRESENT
        if (rte_eal_vfio_setup() < 0) {
@@ -939,8 +943,11 @@ rte_eal_init(int argc, char **argv)
                rte_panic("Cannot probe devices\n");
 
        /* Probe & Initialize PCI devices */
-       if (rte_eal_pci_probe())
-               rte_panic("Cannot probe PCI\n");
+       if (rte_eal_pci_probe()) {
+               rte_eal_init_alert("Cannot probe PCI\n");
+               rte_errno = ENOTSUP;
+               return -1;
+       }
 
        if (rte_eal_dev_init() < 0)
                rte_panic("Cannot init pmd devices\n");