diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c index 14935aa36c..f94b1b4ebb 100644 --- a/lib/librte_eal/bsdapp/eal/eal.c +++ b/lib/librte_eal/bsdapp/eal/eal.c @@ -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"); diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c index 72547bd285..d45b7d3114 100644 --- a/lib/librte_eal/common/eal_common_pci.c +++ b/lib/librte_eal/common/eal_common_pci.c @@ -69,6 +69,7 @@ #include #include +#include #include #include #include @@ -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 */ diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c index b2a900525c..354d0d80d3 100644 --- a/lib/librte_eal/linuxapp/eal/eal.c +++ b/lib/librte_eal/linuxapp/eal/eal.c @@ -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");