Fix wrong address width

A patch was added to fix the wrong address width
This patch refers to commit:
github.com/DPDK/dpdk/commit/54a328f552ff2e0098c3f96f9e32302675f2bcf4
Also it can be removed when the bundled DPDK source is upversioned.

Closes-Bug:1796420

Change-Id: I1d148f170302343982fb0fef07d88994ffefb43e
Signed-off-by: Hayde Martinez <hayde.martinez.landa@intel.com>
(cherry picked from commit 9009950c57)
This commit is contained in:
Hayde Martinez 2018-10-11 16:08:59 -05:00
parent e21e1d843d
commit fcf5d8c3b5
3 changed files with 157 additions and 0 deletions

View File

@ -0,0 +1,25 @@
From 78489fa5c3e98ac9db6244a6707622b4603bf0cb Mon Sep 17 00:00:00 2001
From: Hayde Martinez <hayde.martinez.landa@intel.com>
Date: Thu, 11 Oct 2018 14:44:00 -0500
Subject: [PATCH] iommu-width-fix
Signed-off-by: Hayde Martinez <hayde.martinez.landa@intel.com>
---
SPECS/openvswitch.spec | 1 +
1 file changed, 1 insertion(+)
diff --git a/SPECS/openvswitch.spec b/SPECS/openvswitch.spec
index 29255d5..a3a1c87 100644
--- a/SPECS/openvswitch.spec
+++ b/SPECS/openvswitch.spec
@@ -108,6 +108,7 @@ ExclusiveArch: x86_64 aarch64 ppc64le s390x
# ovs-patches
Patch01: run-services-as-root-user.patch
Patch02: log-rotation-config.patch
+Patch03: iommu-width-fix.patch
# OVS (including OVN) backports (0 - 300)
--
2.7.4

View File

@ -5,3 +5,4 @@
0005-log-rotation-config.patch
0006-rpm-check-with-condition.patch
0007-enable-mlx-pmds.patch
0008-iommu-width-fix.patch

View File

@ -0,0 +1,131 @@
--- openvswitch-2.9.0/dpdk-17.11/drivers/bus/pci/linux/pci.c 2017-11-15 18:00:28.000000000 +0000
+++ openvswitch-2.9.0p/dpdk-17.11/drivers/bus/pci/linux/pci.c 2018-10-10 17:59:58.370080207 +0000
@@ -576,6 +576,86 @@
return 0;
}
+
+#if defined(RTE_ARCH_X86)
+static bool
+pci_one_device_iommu_support_va(struct rte_pci_device *dev)
+{
+#define VTD_CAP_MGAW_SHIFT 16
+#define VTD_CAP_MGAW_MASK (0x3fULL << VTD_CAP_MGAW_SHIFT)
+#define X86_VA_WIDTH 47 /* From Documentation/x86/x86_64/mm.txt */
+ struct rte_pci_addr *addr = &dev->addr;
+ char filename[PATH_MAX];
+ FILE *fp;
+ uint64_t mgaw, vtd_cap_reg = 0;
+
+ snprintf(filename, sizeof(filename),
+ "%s/" PCI_PRI_FMT "/iommu/intel-iommu/cap",
+ rte_pci_get_sysfs_path(), addr->domain, addr->bus, addr->devid,
+ addr->function);
+ if (access(filename, F_OK) == -1) {
+ /* We don't have an Intel IOMMU, assume VA supported*/
+ return true;
+ }
+
+ /* We have an intel IOMMU */
+ fp = fopen(filename, "r");
+ if (fp == NULL) {
+ RTE_LOG(ERR, EAL, "%s(): can't open %s\n", __func__, filename);
+ return false;
+ }
+
+ if (fscanf(fp, "%" PRIx64, &vtd_cap_reg) != 1) {
+ RTE_LOG(ERR, EAL, "%s(): can't read %s\n", __func__, filename);
+ fclose(fp);
+ return false;
+ }
+
+ fclose(fp);
+
+ mgaw = ((vtd_cap_reg & VTD_CAP_MGAW_MASK) >> VTD_CAP_MGAW_SHIFT) + 1;
+ if (mgaw < X86_VA_WIDTH)
+ return false;
+
+ return true;
+}
+#elif defined(RTE_ARCH_PPC_64)
+static bool
+pci_one_device_iommu_support_va(__rte_unused struct rte_pci_device *dev)
+{
+ return false;
+}
+#else
+static bool
+pci_one_device_iommu_support_va(__rte_unused struct rte_pci_device *dev)
+{
+ return true;
+}
+#endif
+
+/*
+ * * All devices IOMMUs support VA as IOVA
+ * */
+static bool
+pci_devices_iommu_support_va(void)
+{
+ struct rte_pci_device *dev = NULL;
+ struct rte_pci_driver *drv = NULL;
+
+ FOREACH_DRIVER_ON_PCIBUS(drv) {
+ FOREACH_DEVICE_ON_PCIBUS(dev) {
+ if (!rte_pci_match(drv, dev))
+ continue;
+ if (!pci_one_device_iommu_support_va(dev))
+ return false;
+ }
+ }
+ return true;
+}
+
+
+
+
/*
* Get iommu class of PCI devices on the bus.
*/
@@ -586,12 +666,7 @@
bool is_vfio_noiommu_enabled = true;
bool has_iova_va;
bool is_bound_uio;
- bool spapr_iommu =
-#if defined(RTE_ARCH_PPC_64)
- true;
-#else
- false;
-#endif
+ bool iommu_no_va;
is_bound = pci_one_device_is_bound();
if (!is_bound)
@@ -599,13 +674,14 @@
has_iova_va = pci_one_device_has_iova_va();
is_bound_uio = pci_one_device_bound_uio();
+ iommu_no_va = !pci_devices_iommu_support_va();
#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 &&
- !spapr_iommu)
+ !iommu_no_va)
return RTE_IOVA_VA;
if (has_iova_va) {
@@ -614,8 +690,8 @@
RTE_LOG(WARNING, EAL, "vfio-noiommu mode configured\n");
if (is_bound_uio)
RTE_LOG(WARNING, EAL, "few device bound to UIO\n");
- if (spapr_iommu)
- RTE_LOG(WARNING, EAL, "sPAPR IOMMU does not support IOVA as VA\n");
+ if (iommu_no_va)
+ RTE_LOG(WARNING, EAL, "IOMMU does not support IOVA as VA\n");
}
return RTE_IOVA_PA;