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

Kleber Souza kleber.souza at canonical.com
Tue Jan 8 11:51:30 UTC 2019


On 1/2/19 8:40 PM, Guilherme G. Piccoli wrote:
> 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>

This is a patch that would have been nice if someone had sent it to
-stable 4.4 :-)

Acked-by: Kleber Sacilotto de Souza <kleber.souza 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");





More information about the kernel-team mailing list