From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 3E2F611C5 for ; Wed, 22 Mar 2017 21:19:49 +0100 (CET) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 87679437F78; Wed, 22 Mar 2017 20:19:49 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 87679437F78 Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=aconole@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 87679437F78 Received: from dhcp-25-97.bos.redhat.com (unknown [10.18.25.172]) by smtp.corp.redhat.com (Postfix) with ESMTP id 05DB018201; Wed, 22 Mar 2017 20:19:48 +0000 (UTC) From: Aaron Conole To: dev@dpdk.org Cc: Bruce Richardson , Thomas Monjalon , Stephen Hemminger Date: Wed, 22 Mar 2017 16:19:37 -0400 Message-Id: <20170322201940.24028-12-aconole@redhat.com> In-Reply-To: <20170322201940.24028-1-aconole@redhat.com> References: <20170322201940.24028-1-aconole@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Wed, 22 Mar 2017 20:19:49 +0000 (UTC) Subject: [dpdk-dev] [PATCH v7 11/14] eal: do not panic on PCI failures X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Mar 2017 20:19:49 -0000 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 --- 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 #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 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