iommu.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths
@ 2020-09-24 14:08 David Woodhouse
  2020-09-25  1:52 ` Lu Baolu
  2021-01-20  9:42 ` David Woodhouse
  0 siblings, 2 replies; 8+ messages in thread
From: David Woodhouse @ 2020-09-24 14:08 UTC (permalink / raw)
  To: Joerg Roedel; +Cc: iommu


[-- Attachment #1.1: Type: text/plain, Size: 2731 bytes --]

From: David Woodhouse <dwmw@amazon.co.uk>

Instead of bailing out completely, such a unit can still be used for
interrupt remapping.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
---
 drivers/iommu/intel/dmar.c | 46 +++++++++++++++++++++++++-------------
 1 file changed, 31 insertions(+), 15 deletions(-)

diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c
index 93e6345f3414..4420a759f095 100644
--- a/drivers/iommu/intel/dmar.c
+++ b/drivers/iommu/intel/dmar.c
@@ -1024,8 +1024,8 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
 {
 	struct intel_iommu *iommu;
 	u32 ver, sts;
-	int agaw = 0;
-	int msagaw = 0;
+	int agaw = -1;
+	int msagaw = -1;
 	int err;
 
 	if (!drhd->reg_base_addr) {
@@ -1050,17 +1050,28 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
 	}
 
 	err = -EINVAL;
-	agaw = iommu_calculate_agaw(iommu);
-	if (agaw < 0) {
-		pr_err("Cannot get a valid agaw for iommu (seq_id = %d)\n",
-			iommu->seq_id);
-		goto err_unmap;
-	}
-	msagaw = iommu_calculate_max_sagaw(iommu);
-	if (msagaw < 0) {
-		pr_err("Cannot get a valid max agaw for iommu (seq_id = %d)\n",
-			iommu->seq_id);
-		goto err_unmap;
+	if (cap_sagaw(iommu->cap) == 0) {
+		pr_info("%s: No supported address widths. Not attempting DMA translation.\n",
+			iommu->name);
+		drhd->ignored = 1;
+	}
+
+	if (!drhd->ignored) {
+		agaw = iommu_calculate_agaw(iommu);
+		if (agaw < 0) {
+			pr_err("Cannot get a valid agaw for iommu (seq_id = %d)\n",
+			       iommu->seq_id);
+			drhd->ignored = 1;
+		}
+	}
+	if (!drhd->ignored) {
+		msagaw = iommu_calculate_max_sagaw(iommu);
+		if (msagaw < 0) {
+			pr_err("Cannot get a valid max agaw for iommu (seq_id = %d)\n",
+			       iommu->seq_id);
+			drhd->ignored = 1;
+			agaw = -1;
+		}
 	}
 	iommu->agaw = agaw;
 	iommu->msagaw = msagaw;
@@ -1087,7 +1098,12 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
 
 	raw_spin_lock_init(&iommu->register_lock);
 
-	if (intel_iommu_enabled) {
+	/*
+	 * This is only for hotplug; at boot time intel_iommu_enabled won't
+	 * be set yet. When intel_iommu_init() runs, it registers the units
+	 * present at boot time, then sets intel_iommu_enabled.
+	 */
+	if (intel_iommu_enabled && !drhd->ignored) {
 		err = iommu_device_sysfs_add(&iommu->iommu, NULL,
 					     intel_iommu_groups,
 					     "%s", iommu->name);
@@ -1117,7 +1133,7 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
 
 static void free_iommu(struct intel_iommu *iommu)
 {
-	if (intel_iommu_enabled) {
+	if (intel_iommu_enabled && iommu->iommu.ops) {
 		iommu_device_unregister(&iommu->iommu);
 		iommu_device_sysfs_remove(&iommu->iommu);
 	}
-- 
2.17.1


[-- Attachment #1.2: smime.p7s --]
[-- Type: application/x-pkcs7-signature, Size: 5174 bytes --]

[-- Attachment #2: Type: text/plain, Size: 156 bytes --]

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths
  2020-09-24 14:08 [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths David Woodhouse
@ 2020-09-25  1:52 ` Lu Baolu
  2020-10-07  9:52   ` Joerg Roedel
  2021-01-20  9:42 ` David Woodhouse
  1 sibling, 1 reply; 8+ messages in thread
From: Lu Baolu @ 2020-09-25  1:52 UTC (permalink / raw)
  To: David Woodhouse, Joerg Roedel; +Cc: iommu


On 9/24/20 10:08 PM, David Woodhouse wrote:
> From: David Woodhouse <dwmw@amazon.co.uk>
> 
> Instead of bailing out completely, such a unit can still be used for
> interrupt remapping.

Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>

Best regards,
baolu

> 
> Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
> ---
>   drivers/iommu/intel/dmar.c | 46 +++++++++++++++++++++++++-------------
>   1 file changed, 31 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c
> index 93e6345f3414..4420a759f095 100644
> --- a/drivers/iommu/intel/dmar.c
> +++ b/drivers/iommu/intel/dmar.c
> @@ -1024,8 +1024,8 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
>   {
>   	struct intel_iommu *iommu;
>   	u32 ver, sts;
> -	int agaw = 0;
> -	int msagaw = 0;
> +	int agaw = -1;
> +	int msagaw = -1;
>   	int err;
>   
>   	if (!drhd->reg_base_addr) {
> @@ -1050,17 +1050,28 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
>   	}
>   
>   	err = -EINVAL;
> -	agaw = iommu_calculate_agaw(iommu);
> -	if (agaw < 0) {
> -		pr_err("Cannot get a valid agaw for iommu (seq_id = %d)\n",
> -			iommu->seq_id);
> -		goto err_unmap;
> -	}
> -	msagaw = iommu_calculate_max_sagaw(iommu);
> -	if (msagaw < 0) {
> -		pr_err("Cannot get a valid max agaw for iommu (seq_id = %d)\n",
> -			iommu->seq_id);
> -		goto err_unmap;
> +	if (cap_sagaw(iommu->cap) == 0) {
> +		pr_info("%s: No supported address widths. Not attempting DMA translation.\n",
> +			iommu->name);
> +		drhd->ignored = 1;
> +	}
> +
> +	if (!drhd->ignored) {
> +		agaw = iommu_calculate_agaw(iommu);
> +		if (agaw < 0) {
> +			pr_err("Cannot get a valid agaw for iommu (seq_id = %d)\n",
> +			       iommu->seq_id);
> +			drhd->ignored = 1;
> +		}
> +	}
> +	if (!drhd->ignored) {
> +		msagaw = iommu_calculate_max_sagaw(iommu);
> +		if (msagaw < 0) {
> +			pr_err("Cannot get a valid max agaw for iommu (seq_id = %d)\n",
> +			       iommu->seq_id);
> +			drhd->ignored = 1;
> +			agaw = -1;
> +		}
>   	}
>   	iommu->agaw = agaw;
>   	iommu->msagaw = msagaw;
> @@ -1087,7 +1098,12 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
>   
>   	raw_spin_lock_init(&iommu->register_lock);
>   
> -	if (intel_iommu_enabled) {
> +	/*
> +	 * This is only for hotplug; at boot time intel_iommu_enabled won't
> +	 * be set yet. When intel_iommu_init() runs, it registers the units
> +	 * present at boot time, then sets intel_iommu_enabled.
> +	 */
> +	if (intel_iommu_enabled && !drhd->ignored) {
>   		err = iommu_device_sysfs_add(&iommu->iommu, NULL,
>   					     intel_iommu_groups,
>   					     "%s", iommu->name);
> @@ -1117,7 +1133,7 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
>   
>   static void free_iommu(struct intel_iommu *iommu)
>   {
> -	if (intel_iommu_enabled) {
> +	if (intel_iommu_enabled && iommu->iommu.ops) {
>   		iommu_device_unregister(&iommu->iommu);
>   		iommu_device_sysfs_remove(&iommu->iommu);
>   	}
> 
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths
  2020-09-25  1:52 ` Lu Baolu
@ 2020-10-07  9:52   ` Joerg Roedel
  0 siblings, 0 replies; 8+ messages in thread
From: Joerg Roedel @ 2020-10-07  9:52 UTC (permalink / raw)
  To: Lu Baolu; +Cc: iommu, David Woodhouse

On Fri, Sep 25, 2020 at 09:52:31AM +0800, Lu Baolu wrote:
> 
> On 9/24/20 10:08 PM, David Woodhouse wrote:
> > From: David Woodhouse <dwmw@amazon.co.uk>
> > 
> > Instead of bailing out completely, such a unit can still be used for
> > interrupt remapping.
> 
> Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>

Applied, thanks.

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths
  2020-09-24 14:08 [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths David Woodhouse
  2020-09-25  1:52 ` Lu Baolu
@ 2021-01-20  9:42 ` David Woodhouse
  2021-01-20 12:06   ` Greg KH
  1 sibling, 1 reply; 8+ messages in thread
From: David Woodhouse @ 2021-01-20  9:42 UTC (permalink / raw)
  To: Joerg Roedel, Will Deacon, stable
  Cc: Mendoza-jonas, Samuel, Sironi, Filippo, iommu


[-- Attachment #1.1: Type: text/plain, Size: 641 bytes --]

On Thu, 2020-09-24 at 15:08 +0100, David Woodhouse wrote:
> From: David Woodhouse <dwmw@amazon.co.uk>
> 
> Instead of bailing out completely, such a unit can still be used for
> interrupt remapping.
> 
> Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>

Could we have this for stable too please, along with the trivial
subsequent fixup. They are:

c40aaaac1018 ("iommu/vt-d: Gracefully handle DMAR units with no supported address widths")
9def3b1a07c4 ("iommu/vt-d: Don't dereference iommu_device if IOMMU_API is not built")

They apply fairly straightforwardly when backported; let me know if you
want us to send patches.

[-- Attachment #1.2: smime.p7s --]
[-- Type: application/x-pkcs7-signature, Size: 5174 bytes --]

[-- Attachment #2: Type: text/plain, Size: 156 bytes --]

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths
  2021-01-20  9:42 ` David Woodhouse
@ 2021-01-20 12:06   ` Greg KH
  2021-01-20 15:55     ` David Woodhouse
  0 siblings, 1 reply; 8+ messages in thread
From: Greg KH @ 2021-01-20 12:06 UTC (permalink / raw)
  To: David Woodhouse
  Cc: Mendoza-jonas, Samuel, Sironi, Filippo, stable, iommu, Will Deacon

On Wed, Jan 20, 2021 at 09:42:43AM +0000, David Woodhouse wrote:
> On Thu, 2020-09-24 at 15:08 +0100, David Woodhouse wrote:
> > From: David Woodhouse <dwmw@amazon.co.uk>
> > 
> > Instead of bailing out completely, such a unit can still be used for
> > interrupt remapping.
> > 
> > Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
> 
> Could we have this for stable too please, along with the trivial
> subsequent fixup. They are:
> 
> c40aaaac1018 ("iommu/vt-d: Gracefully handle DMAR units with no supported address widths")
> 9def3b1a07c4 ("iommu/vt-d: Don't dereference iommu_device if IOMMU_API is not built")
> 
> They apply fairly straightforwardly when backported; let me know if you
> want us to send patches.

What stable kernel(s) do you want this in?  The above patches are
already in 5.10.

thanks,

greg k-h
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths
  2021-01-20 12:06   ` Greg KH
@ 2021-01-20 15:55     ` David Woodhouse
  2021-01-20 17:04       ` Greg KH
  0 siblings, 1 reply; 8+ messages in thread
From: David Woodhouse @ 2021-01-20 15:55 UTC (permalink / raw)
  To: Greg KH
  Cc: Mendoza-jonas, Samuel, Sironi, Filippo, stable, iommu, Will Deacon


[-- Attachment #1.1: Type: text/plain, Size: 1358 bytes --]

On Wed, 2021-01-20 at 13:06 +0100, Greg KH wrote:
> On Wed, Jan 20, 2021 at 09:42:43AM +0000, David Woodhouse wrote:
> > On Thu, 2020-09-24 at 15:08 +0100, David Woodhouse wrote:
> > > From: David Woodhouse <dwmw@amazon.co.uk>
> > > 
> > > Instead of bailing out completely, such a unit can still be used for
> > > interrupt remapping.
> > > 
> > > Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
> > 
> > Could we have this for stable too please, along with the trivial
> > subsequent fixup. They are:
> > 
> > c40aaaac1018 ("iommu/vt-d: Gracefully handle DMAR units with no supported address widths")
> > 9def3b1a07c4 ("iommu/vt-d: Don't dereference iommu_device if IOMMU_API is not built")
> > 
> > They apply fairly straightforwardly when backported; let me know if you
> > want us to send patches.
> 
> What stable kernel(s) do you want this in?  The above patches are
> already in 5.10.

It's a fairly simple bug fix, to still use a given IOMMU for interrupt
remapping even if it can't be used for DMA mapping.

Those features are somewhat orthogonal, and it was wrong for the kernel
to bail out on the IOMMU hardware completely.

The interrupt remapping support is what's required for Intel boxes (or
VMs) to run with more than 255 CPUs. It should be fairly simple to fix
the same bug at least as far back as 4.14.


[-- Attachment #1.2: smime.p7s --]
[-- Type: application/x-pkcs7-signature, Size: 5174 bytes --]

[-- Attachment #2: Type: text/plain, Size: 156 bytes --]

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths
  2021-01-20 15:55     ` David Woodhouse
@ 2021-01-20 17:04       ` Greg KH
  2021-01-20 20:06         ` David Woodhouse
  0 siblings, 1 reply; 8+ messages in thread
From: Greg KH @ 2021-01-20 17:04 UTC (permalink / raw)
  To: David Woodhouse
  Cc: Mendoza-jonas, Samuel, Sironi, Filippo, stable, iommu, Will Deacon

On Wed, Jan 20, 2021 at 03:55:05PM +0000, David Woodhouse wrote:
> On Wed, 2021-01-20 at 13:06 +0100, Greg KH wrote:
> > On Wed, Jan 20, 2021 at 09:42:43AM +0000, David Woodhouse wrote:
> > > On Thu, 2020-09-24 at 15:08 +0100, David Woodhouse wrote:
> > > > From: David Woodhouse <dwmw@amazon.co.uk>
> > > > 
> > > > Instead of bailing out completely, such a unit can still be used for
> > > > interrupt remapping.
> > > > 
> > > > Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
> > > 
> > > Could we have this for stable too please, along with the trivial
> > > subsequent fixup. They are:
> > > 
> > > c40aaaac1018 ("iommu/vt-d: Gracefully handle DMAR units with no supported address widths")
> > > 9def3b1a07c4 ("iommu/vt-d: Don't dereference iommu_device if IOMMU_API is not built")
> > > 
> > > They apply fairly straightforwardly when backported; let me know if you
> > > want us to send patches.
> > 
> > What stable kernel(s) do you want this in?  The above patches are
> > already in 5.10.
> 
> It's a fairly simple bug fix, to still use a given IOMMU for interrupt
> remapping even if it can't be used for DMA mapping.
> 
> Those features are somewhat orthogonal, and it was wrong for the kernel
> to bail out on the IOMMU hardware completely.
> 
> The interrupt remapping support is what's required for Intel boxes (or
> VMs) to run with more than 255 CPUs. It should be fairly simple to fix
> the same bug at least as far back as 4.14.

I tried applying these to 5.4, 4.19, and 4.14, and they all fail to
build:

drivers/iommu/dmar.c: In function ‘free_iommu’:
drivers/iommu/dmar.c:1140:35: error: ‘struct intel_iommu’ has no member named ‘drhd’
 1140 |  if (intel_iommu_enabled && !iommu->drhd->ignored) {
      |                                   ^~

So if you could provide a working set of patches backported, I will be
glad to queue them up.

thanks,

greg k-h
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths
  2021-01-20 17:04       ` Greg KH
@ 2021-01-20 20:06         ` David Woodhouse
  0 siblings, 0 replies; 8+ messages in thread
From: David Woodhouse @ 2021-01-20 20:06 UTC (permalink / raw)
  To: Greg KH
  Cc: Mendoza-jonas, Samuel, Sironi, Filippo, stable, iommu, Will Deacon


[-- Attachment #1.1: Type: text/plain, Size: 619 bytes --]

On Wed, 2021-01-20 at 18:04 +0100, Greg KH wrote:
> I tried applying these to 5.4, 4.19, and 4.14, and they all fail to
> build:
> 
> drivers/iommu/dmar.c: In function ‘free_iommu’:
> drivers/iommu/dmar.c:1140:35: error: ‘struct intel_iommu’ has no member named ‘drhd’
>  1140 |  if (intel_iommu_enabled && !iommu->drhd->ignored) {
>       |                                   ^~
> 
> So if you could provide a working set of patches backported, I will be
> glad to queue them up.

Thanks.

I'm just heckling at Sam's backport of those, and we'll post tested
patches as soon as we're done.


[-- Attachment #1.2: smime.p7s --]
[-- Type: application/x-pkcs7-signature, Size: 5174 bytes --]

[-- Attachment #2: Type: text/plain, Size: 156 bytes --]

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2021-01-20 20:09 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-24 14:08 [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths David Woodhouse
2020-09-25  1:52 ` Lu Baolu
2020-10-07  9:52   ` Joerg Roedel
2021-01-20  9:42 ` David Woodhouse
2021-01-20 12:06   ` Greg KH
2021-01-20 15:55     ` David Woodhouse
2021-01-20 17:04       ` Greg KH
2021-01-20 20:06         ` David Woodhouse

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).