From: Ben Walker <benjamin.walker@intel.com>
To: dev@dpdk.org
Cc: Ben Walker <benjamin.walker@intel.com>
Subject: [dpdk-dev] [PATCH 11/12] eal/pci: rte_pci_get_iommu_class handles no drivers
Date: Thu, 30 May 2019 10:48:18 -0700 [thread overview]
Message-ID: <20190530174819.1160221-12-benjamin.walker@intel.com> (raw)
In-Reply-To: <20190530174819.1160221-1-benjamin.walker@intel.com>
In the case where no drivers are registered with the system,
rte_pci_get_iommu_class should return RTE_IOVA_DC.
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Change-Id: Ia5b0cae100cfcfe46a9e4996328f9746ce33cfd3
---
drivers/bus/pci/linux/pci.c | 79 ++++++++++++++++++-------------------
1 file changed, 38 insertions(+), 41 deletions(-)
diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c
index 09af66571..abc21061f 100644
--- a/drivers/bus/pci/linux/pci.c
+++ b/drivers/bus/pci/linux/pci.c
@@ -589,49 +589,68 @@ pci_ignore_device(struct rte_pci_device *dev)
enum rte_iova_mode
rte_pci_get_iommu_class(void)
{
- bool is_bound = false;
- bool is_vfio_noiommu_enabled = true;
- bool has_iova_va = false;
- bool is_bound_uio = false;
- bool iommu_no_va = false;
- struct rte_pci_device *dev = NULL;
- struct rte_pci_driver *drv = NULL;
+ struct rte_pci_device *dev;
+ struct rte_pci_driver *drv;
+ struct rte_pci_addr *addr;
+ enum rte_iova_mode iova_mode;
+
+ iova_mode = RTE_IOVA_DC;
FOREACH_DEVICE_ON_PCIBUS(dev) {
if (pci_ignore_device(dev))
continue;
+ addr = &dev->addr;
+
switch (dev->kdrv) {
case RTE_KDRV_UNKNOWN:
case RTE_KDRV_NONE:
break;
case RTE_KDRV_VFIO:
- is_bound = true;
FOREACH_DRIVER_ON_PCIBUS(drv) {
if (!rte_pci_match(drv, dev))
continue;
- /*
- * just one PCI device needs to be checked out because
- * the IOMMU hardware is the same for all of them.
- */
- iommu_no_va = !pci_one_device_iommu_support_va(dev);
+ if ((drv->drv_flags & RTE_PCI_DRV_IOVA_AS_VA) == 0)
+ continue;
- if (drv->drv_flags & RTE_PCI_DRV_IOVA_AS_VA) {
- has_iova_va = true;
- break;
+ if (!pci_one_device_iommu_support_va(dev)) {
+ RTE_LOG(WARNING, EAL, "Device " PCI_PRI_FMT " wanted IOVA as VA, but ",
+ addr->domain, addr->bus, addr->devid, addr->function);
+ RTE_LOG(WARNING, EAL, "IOMMU does not support it.\n");
+ iova_mode = RTE_IOVA_PA;
+ }
+#ifdef VFIO_PRESENT
+ else if (rte_vfio_noiommu_is_enabled()) {
+ RTE_LOG(WARNING, EAL, "Device " PCI_PRI_FMT " wanted IOVA as VA, but ",
+ addr->domain, addr->bus, addr->devid, addr->function);
+ RTE_LOG(WARNING, EAL, "vfio-noiommu is enabled.\n");
+ iova_mode = RTE_IOVA_PA;
+#endif
+ } else if (iova_mode == RTE_IOVA_PA) {
+ RTE_LOG(WARNING, EAL, "Device " PCI_PRI_FMT " wanted IOVA as VA, but ",
+ addr->domain, addr->bus, addr->devid, addr->function);
+ RTE_LOG(WARNING, EAL, "other devices require PA.\n");
+ } else {
+ iova_mode = RTE_IOVA_VA;
}
}
break;
case RTE_KDRV_IGB_UIO:
case RTE_KDRV_UIO_GENERIC:
case RTE_KDRV_NIC_UIO:
- is_bound = true;
FOREACH_DRIVER_ON_PCIBUS(drv) {
if (!rte_pci_match(drv, dev))
continue;
- is_bound_uio = true;
+ if (iova_mode == RTE_IOVA_VA) {
+ RTE_LOG(WARNING, EAL, "Some devices wanted IOVA as VA, but ");
+ RTE_LOG(WARNING, EAL, "device " PCI_PRI_FMT " requires PA.\n",
+ addr->domain, addr->bus, addr->devid, addr->function);
+
+ }
+
+ iova_mode = RTE_IOVA_PA;
break;
}
break;
@@ -639,29 +658,7 @@ rte_pci_get_iommu_class(void)
}
}
- if (!is_bound)
- return RTE_IOVA_DC;
-
-#ifdef VFIO_PRESENT
- is_vfio_noiommu_enabled = rte_vfio_noiommu_is_enabled() == true ?
- true : false;
-#endif
-
- if (has_iova_va && !is_bound_uio && !is_vfio_noiommu_enabled &&
- !iommu_no_va)
- return RTE_IOVA_VA;
-
- if (has_iova_va) {
- RTE_LOG(WARNING, EAL, "Some devices want iova as va but pa will be used because.. ");
- if (is_vfio_noiommu_enabled)
- RTE_LOG(WARNING, EAL, "vfio-noiommu mode configured\n");
- if (is_bound_uio)
- RTE_LOG(WARNING, EAL, "few device bound to UIO\n");
- if (iommu_no_va)
- RTE_LOG(WARNING, EAL, "IOMMU does not support IOVA as VA\n");
- }
-
- return RTE_IOVA_PA;
+ return iova_mode;
}
/* Read PCI config space. */
--
2.20.1
next prev parent reply other threads:[~2019-05-30 17:48 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-30 17:48 [dpdk-dev] eal/pci: Improve automatic selection of IOVA mode Ben Walker
2019-05-30 17:48 ` [dpdk-dev] [PATCH 01/12] eal: Make rte_eal_using_phys_addrs work sooner Ben Walker
2019-05-30 21:29 ` [dpdk-dev] [PATCH v2 " Ben Walker
2019-05-30 21:29 ` [dpdk-dev] [PATCH v2 02/12] eal/pci: Inline several functions into rte_pci_get_iommu_class Ben Walker
2019-05-30 21:29 ` [dpdk-dev] [PATCH v2 03/12] eal/pci: Rework loops in rte_pci_get_iommu_class Ben Walker
2019-05-30 21:29 ` [dpdk-dev] [PATCH v2 04/12] eal/pci: Collapse two " Ben Walker
2019-05-30 21:29 ` [dpdk-dev] [PATCH v2 05/12] eal/pci: Add function pci_ignore_device Ben Walker
2019-05-30 21:29 ` [dpdk-dev] [PATCH v2 06/12] eal/pci: Correctly test whitelist/blacklist in rte_pci_get_iommu_class Ben Walker
2019-05-30 21:29 ` [dpdk-dev] [PATCH v2 07/12] eal/pci: Reverse if check " Ben Walker
2019-05-30 21:29 ` [dpdk-dev] [PATCH v2 08/12] eal/pci: Collapse loops " Ben Walker
2019-05-30 21:29 ` [dpdk-dev] [PATCH v2 09/12] eal/pci: Simplify rte_pci_get_iommu class by using a switch Ben Walker
2019-05-30 21:29 ` [dpdk-dev] [PATCH v2 10/12] eal/pci: Finding a device bound to UIO does not force PA Ben Walker
2019-05-30 21:29 ` [dpdk-dev] [PATCH v2 11/12] eal/pci: rte_pci_get_iommu_class handles no drivers Ben Walker
2019-05-30 21:29 ` [dpdk-dev] [PATCH v2 12/12] eal: If bus can't decide PA or VA, try to access PA Ben Walker
2019-05-30 17:48 ` [dpdk-dev] [PATCH 02/12] eal/pci: Inline several functions into rte_pci_get_iommu_class Ben Walker
2019-05-30 17:57 ` Stephen Hemminger
2019-05-30 18:09 ` Walker, Benjamin
2019-05-30 17:48 ` [dpdk-dev] [PATCH 03/12] eal/pci: Rework loops in rte_pci_get_iommu_class Ben Walker
2019-05-30 17:48 ` [dpdk-dev] [PATCH 04/12] eal/pci: Collapse two " Ben Walker
2019-05-30 17:48 ` [dpdk-dev] [PATCH 05/12] eal/pci: Add function pci_ignore_device Ben Walker
2019-05-30 17:48 ` [dpdk-dev] [PATCH 06/12] eal/pci: Correctly test whitelist/blacklist in rte_pci_get_iommu_class Ben Walker
2019-05-30 17:48 ` [dpdk-dev] [PATCH 07/12] eal/pci: Reverse if check " Ben Walker
2019-05-30 17:48 ` [dpdk-dev] [PATCH 08/12] eal/pci: Collapse loops " Ben Walker
2019-05-30 17:48 ` [dpdk-dev] [PATCH 09/12] eal/pci: Simplify rte_pci_get_iommu class by using a switch Ben Walker
2019-05-30 17:48 ` [dpdk-dev] [PATCH 10/12] eal/pci: Finding a device bound to UIO does not force PA Ben Walker
2019-05-30 17:48 ` Ben Walker [this message]
2019-05-30 17:48 ` [dpdk-dev] [PATCH 12/12] eal: If bus can't decide PA or VA, try to access PA Ben Walker
2019-06-03 10:48 ` [dpdk-dev] eal/pci: Improve automatic selection of IOVA mode David Marchand
2019-06-03 16:44 ` Walker, Benjamin
2019-06-14 8:42 ` David Marchand
2019-06-14 9:39 ` [dpdk-dev] [PATCH v2 0/3] " David Marchand
2019-06-14 9:39 ` [dpdk-dev] [PATCH v2 1/3] kni: refuse to initialise when IOVA is not PA David Marchand
2019-06-14 9:39 ` [dpdk-dev] [PATCH v2 2/3] eal: compute IOVA mode based on PA availability David Marchand
2019-07-03 10:17 ` Burakov, Anatoly
2019-07-04 7:13 ` David Marchand
2019-06-14 9:39 ` [dpdk-dev] [PATCH v2 3/3] bus/pci: only consider usable devices to select IOVA mode David Marchand
2019-07-03 10:45 ` Burakov, Anatoly
2019-07-04 9:18 ` David Marchand
2019-07-04 10:43 ` Burakov, Anatoly
2019-07-04 10:47 ` David Marchand
2019-07-04 17:14 ` Stephen Hemminger
2019-07-05 7:58 ` David Marchand
2019-07-05 16:27 ` Stephen Hemminger
2019-07-05 8:26 ` Thomas Monjalon
2019-06-27 17:05 ` [dpdk-dev] [PATCH v2 0/3] Improve automatic selection of " Thomas Monjalon
2019-07-02 14:18 ` Thomas Monjalon
2019-07-05 14:57 ` Thomas Monjalon
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=20190530174819.1160221-12-benjamin.walker@intel.com \
--to=benjamin.walker@intel.com \
--cc=dev@dpdk.org \
/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).