DPDK patches and discussions
 help / color / mirror / Atom feed
From: Aaron Conole <aconole@redhat.com>
To: dev@dpdk.org
Cc: Bruce Richardson <bruce.richardson@intel.com>,
	Thomas Monjalon <thomas.monjalon@6wind.com>,
	Stephen Hemminger <stephen@networkplumber.org>
Subject: [dpdk-dev] [PATCH v7 11/14] eal: do not panic on PCI failures
Date: Wed, 22 Mar 2017 16:19:37 -0400	[thread overview]
Message-ID: <20170322201940.24028-12-aconole@redhat.com> (raw)
In-Reply-To: <20170322201940.24028-1-aconole@redhat.com>

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>
---
 lib/librte_eal/bsdapp/eal/eal.c        | 15 +++++++++++----
 lib/librte_eal/common/eal_common_pci.c | 12 +++++++++---
 lib/librte_eal/linuxapp/eal/eal.c      | 15 +++++++++++----
 3 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
index 7c6dd4e..75ddf31 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 72547bd..d45b7d3 100644
--- a/lib/librte_eal/common/eal_common_pci.c
+++ b/lib/librte_eal/common/eal_common_pci.c
@@ -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 */
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index b2a9005..354d0d8 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");
-- 
2.9.3

  parent reply	other threads:[~2017-03-22 20:19 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-22 20:19 [dpdk-dev] [PATCH v7 00/14] eal: Remove most causes of panic on init Aaron Conole
2017-03-22 20:19 ` [dpdk-dev] [PATCH v7 01/14] eal: do not panic on cpu detection Aaron Conole
2017-03-22 20:19 ` [dpdk-dev] [PATCH v7 02/14] eal: do not panic when CPU isn't supported Aaron Conole
2017-03-23 13:47   ` Bruce Richardson
2017-03-23 14:27     ` Aaron Conole
2017-03-22 20:19 ` [dpdk-dev] [PATCH v7 03/14] eal: do not panic on hugepage info init Aaron Conole
2017-03-22 20:19 ` [dpdk-dev] [PATCH v7 04/14] eal: do not panic if parsing args returns error Aaron Conole
2017-03-22 20:19 ` [dpdk-dev] [PATCH v7 05/14] eal: do not panic on memzone initialization fails Aaron Conole
2017-03-22 20:19 ` [dpdk-dev] [PATCH v7 06/14] eal: set errno when exiting for already called Aaron Conole
2017-03-22 20:19 ` [dpdk-dev] [PATCH v7 07/14] eal: do not panic on a number of conditions Aaron Conole
2017-03-22 20:19 ` [dpdk-dev] [PATCH v7 08/14] eal: do not panic on timer init failure Aaron Conole
2017-03-22 20:19 ` [dpdk-dev] [PATCH v7 09/14] eal: do not panic on interrupt thread init Aaron Conole
2017-03-22 20:19 ` [dpdk-dev] [PATCH v7 10/14] eal: do not error if plugins fail to init Aaron Conole
2017-03-22 20:19 ` Aaron Conole [this message]
2017-03-22 20:19 ` [dpdk-dev] [PATCH v7 12/14] eal: do not panic if vdev init fails Aaron Conole
2017-03-22 20:19 ` [dpdk-dev] [PATCH v7 13/14] eal: do not panic when bus probe/scan fails Aaron Conole
2017-03-22 20:19 ` [dpdk-dev] [PATCH v7 14/14] rte_eal_init: add info about various error codes Aaron Conole
2017-03-23 14:04 ` [dpdk-dev] [PATCH v7 00/14] eal: Remove most causes of panic on init Bruce Richardson
2017-03-27 14:06   ` Thomas Monjalon
2017-03-31 17:54     ` Aaron Conole

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170322201940.24028-12-aconole@redhat.com \
    --to=aconole@redhat.com \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=stephen@networkplumber.org \
    --cc=thomas.monjalon@6wind.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).