Merge "Fix wrong address width"
This commit is contained in:
commit
f6a30cfb93
@ -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
|
||||||
|
|
@ -5,3 +5,4 @@
|
|||||||
0005-log-rotation-config.patch
|
0005-log-rotation-config.patch
|
||||||
0006-rpm-check-with-condition.patch
|
0006-rpm-check-with-condition.patch
|
||||||
0007-enable-mlx-pmds.patch
|
0007-enable-mlx-pmds.patch
|
||||||
|
0008-iommu-width-fix.patch
|
||||||
|
131
networking/openvswitch/centos/patches/iommu-width-fix.patch
Normal file
131
networking/openvswitch/centos/patches/iommu-width-fix.patch
Normal 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;
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user