eal: do not panic on PCI failures
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>
This commit is contained in:
parent
4fe1d33987
commit
10f6c93cea
@ -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");
|
||||
|
@ -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 */
|
||||
|
@ -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");
|
||||
|
Loading…
x
Reference in New Issue
Block a user