[SRU X] [PATCH 1/1] iommu/vt-d: Make sure IOMMUs are off when intel_iommu=off

Guilherme G. Piccoli gpiccoli at canonical.com
Wed Jan 2 19:40:16 UTC 2019


From: Joerg Roedel <jroedel at suse.de>

BugLink: https://launchpad.net/bugs/1810328

When booting into a kexec kernel with intel_iommu=off, and
the previous kernel had intel_iommu=on, the IOMMU hardware
is still enabled and gets not disabled by the new kernel.

This causes the boot to fail because DMA is blocked by the
hardware. Disable the IOMMUs when we find it enabled in the
kexec kernel and boot with intel_iommu=off.

Signed-off-by: Joerg Roedel <jroedel at suse.de>
(backported from commit 161b28aae1651aa7ad63ec14753aa8a751154340 upstream)
[gpiccoli: context adjustment]
Signed-off-by: Guilherme G. Piccoli <gpiccoli at canonical.com>
---
 drivers/iommu/intel-iommu.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 49b266433f4c..03f817d118f3 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -4648,6 +4648,15 @@ const struct attribute_group *intel_iommu_groups[] = {
 	NULL,
 };
 
+static void intel_disable_iommus(void)
+{
+	struct intel_iommu *iommu = NULL;
+	struct dmar_drhd_unit *drhd;
+
+	for_each_iommu(iommu, drhd)
+		iommu_disable_translation(iommu);
+}
+
 int __init intel_iommu_init(void)
 {
 	int ret = -ENODEV;
@@ -4676,8 +4685,15 @@ int __init intel_iommu_init(void)
 		goto out_free_dmar;
 	}
 
-	if (no_iommu || dmar_disabled)
+	if (no_iommu || dmar_disabled) {
+		/*
+		 * Make sure the IOMMUs are switched off, even when we
+		 * boot into a kexec kernel and the previous kernel left
+		 * them enabled
+		 */
+		intel_disable_iommus();
 		goto out_free_dmar;
+	}
 
 	if (list_empty(&dmar_rmrr_units))
 		pr_info("No RMRR found\n");
-- 
2.19.2




More information about the kernel-team mailing list