eal: do not panic on a number of conditions

When log initialization fails, it's generally because the fopencookie
failed.  While this is rare in practice, it could happen, and it is
likely because of memory pressure.  So, flag the error, and allow the
user to retry.

Memory init can only fail when access to hugepages (either as primary or
secondary process) fails (and that is usually permissions).  Since the
manner of failure is not reversible, we cannot allow retry.

There are some theoretical racy conditions in the system that _could_
cause early tailq init to fail;  however, no need to panic the
application.  While it can't continue using DPDK, it could make better
alerts to the user.

rte_eal_alarm_init() call uses the linux timerfd framework to create a
poll()-able timer using standard posix file operations.  This could fail
for a few reasons given in the man-pages, but many could be
corrected by the user application.  No need to panic.

Signed-off-by: Aaron Conole <aconole@redhat.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
This commit is contained in:
Aaron Conole 2017-03-22 16:19:33 -04:00 committed by Thomas Monjalon
parent 8f113d9818
commit 7d5c430f69
3 changed files with 43 additions and 18 deletions

View File

@ -569,8 +569,11 @@ rte_eal_init(int argc, char **argv)
rte_config_init();
if (rte_eal_memory_init() < 0)
rte_panic("Cannot init memory\n");
if (rte_eal_memory_init() < 0) {
rte_eal_init_alert("Cannot init memory\n");
rte_errno = ENOMEM;
return -1;
}
if (rte_eal_memzone_init() < 0) {
rte_eal_init_alert("Cannot init memzone\n");
@ -578,11 +581,17 @@ rte_eal_init(int argc, char **argv)
return -1;
}
if (rte_eal_tailqs_init() < 0)
rte_panic("Cannot init tail queues for objects\n");
if (rte_eal_tailqs_init() < 0) {
rte_eal_init_alert("Cannot init tail queues for objects\n");
rte_errno = EFAULT;
return -1;
}
if (rte_eal_alarm_init() < 0)
rte_panic("Cannot init interrupt-handling thread\n");
if (rte_eal_alarm_init() < 0) {
rte_eal_init_alert("Cannot init interrupt-handling thread\n");
/* rte_eal_alarm_init sets rte_errno on failure. */
return -1;
}
if (rte_eal_intr_init() < 0)
rte_panic("Cannot init interrupt-handling thread\n");

View File

@ -188,8 +188,7 @@ rte_eal_tailqs_init(void)
if (t->head == NULL) {
RTE_LOG(ERR, EAL,
"Cannot initialize tailq: %s\n", t->name);
/* no need to TAILQ_REMOVE, we are going to panic in
* rte_eal_init() */
/* TAILQ_REMOVE not needed, error is already fatal */
goto fail;
}
}

View File

@ -825,19 +825,30 @@ rte_eal_init(int argc, char **argv)
rte_config_init();
if (rte_eal_log_init(logid, internal_config.syslog_facility) < 0)
rte_panic("Cannot init logs\n");
if (rte_eal_log_init(logid, internal_config.syslog_facility) < 0) {
rte_eal_init_alert("Cannot init logging.");
rte_errno = ENOMEM;
rte_atomic32_clear(&run_once);
return -1;
}
if (rte_eal_pci_init() < 0)
rte_panic("Cannot init PCI\n");
#ifdef VFIO_PRESENT
if (rte_eal_vfio_setup() < 0)
rte_panic("Cannot init VFIO\n");
if (rte_eal_vfio_setup() < 0) {
rte_eal_init_alert("Cannot init VFIO\n");
rte_errno = EAGAIN;
rte_atomic32_clear(&run_once);
return -1;
}
#endif
if (rte_eal_memory_init() < 0)
rte_panic("Cannot init memory\n");
if (rte_eal_memory_init() < 0) {
rte_eal_init_alert("Cannot init memory\n");
rte_errno = ENOMEM;
return -1;
}
/* the directories are locked during eal_hugepage_info_init */
eal_hugedirs_unlock();
@ -848,11 +859,17 @@ rte_eal_init(int argc, char **argv)
return -1;
}
if (rte_eal_tailqs_init() < 0)
rte_panic("Cannot init tail queues for objects\n");
if (rte_eal_tailqs_init() < 0) {
rte_eal_init_alert("Cannot init tail queues for objects\n");
rte_errno = EFAULT;
return -1;
}
if (rte_eal_alarm_init() < 0)
rte_panic("Cannot init interrupt-handling thread\n");
if (rte_eal_alarm_init() < 0) {
rte_eal_init_alert("Cannot init interrupt-handling thread\n");
/* rte_eal_alarm_init sets rte_errno on failure. */
return -1;
}
if (rte_eal_timer_init() < 0)
rte_panic("Cannot init HPET or TSC timers\n");