Re: [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths

2021-01-20 Thread David Woodhouse
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.



smime.p7s
Description: S/MIME cryptographic signature
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Re: [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths

2021-01-20 Thread Greg KH
On Wed, Jan 20, 2021 at 03:55:05PM +, David Woodhouse wrote:
> On Wed, 2021-01-20 at 13:06 +0100, Greg KH wrote:
> > On Wed, Jan 20, 2021 at 09:42:43AM +, David Woodhouse wrote:
> > > On Thu, 2020-09-24 at 15:08 +0100, David Woodhouse wrote:
> > > > From: David Woodhouse 
> > > > 
> > > > Instead of bailing out completely, such a unit can still be used for
> > > > interrupt remapping.
> > > > 
> > > > Signed-off-by: David Woodhouse 
> > > 
> > > Could we have this for stable too please, along with the trivial
> > > subsequent fixup. They are:
> > > 
> > > c40c1018 ("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

Re: [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths

2021-01-20 Thread David Woodhouse
On Wed, 2021-01-20 at 13:06 +0100, Greg KH wrote:
> On Wed, Jan 20, 2021 at 09:42:43AM +, David Woodhouse wrote:
> > On Thu, 2020-09-24 at 15:08 +0100, David Woodhouse wrote:
> > > From: David Woodhouse 
> > > 
> > > Instead of bailing out completely, such a unit can still be used for
> > > interrupt remapping.
> > > 
> > > Signed-off-by: David Woodhouse 
> > 
> > Could we have this for stable too please, along with the trivial
> > subsequent fixup. They are:
> > 
> > c40c1018 ("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.



smime.p7s
Description: S/MIME cryptographic signature
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Re: [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths

2021-01-20 Thread Greg KH
On Wed, Jan 20, 2021 at 09:42:43AM +, David Woodhouse wrote:
> On Thu, 2020-09-24 at 15:08 +0100, David Woodhouse wrote:
> > From: David Woodhouse 
> > 
> > Instead of bailing out completely, such a unit can still be used for
> > interrupt remapping.
> > 
> > Signed-off-by: David Woodhouse 
> 
> Could we have this for stable too please, along with the trivial
> subsequent fixup. They are:
> 
> c40c1018 ("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


Re: [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths

2021-01-20 Thread David Woodhouse
On Thu, 2020-09-24 at 15:08 +0100, David Woodhouse wrote:
> From: David Woodhouse 
> 
> Instead of bailing out completely, such a unit can still be used for
> interrupt remapping.
> 
> Signed-off-by: David Woodhouse 

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

c40c1018 ("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.


smime.p7s
Description: S/MIME cryptographic signature
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Re: [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths

2020-10-07 Thread Joerg Roedel
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 
> > 
> > Instead of bailing out completely, such a unit can still be used for
> > interrupt remapping.
> 
> Reviewed-by: Lu Baolu 

Applied, thanks.

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


Re: [PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths

2020-09-24 Thread Lu Baolu



On 9/24/20 10:08 PM, David Woodhouse wrote:

From: David Woodhouse 

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


Reviewed-by: Lu Baolu 

Best regards,
baolu



Signed-off-by: David Woodhouse 
---
  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(>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, 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_device_sysfs_remove(>iommu);
}


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


[PATCH] iommu/vt-d: gracefully handle DMAR units with no supported address widths

2020-09-24 Thread David Woodhouse
From: David Woodhouse 

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

Signed-off-by: David Woodhouse 
---
 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(>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, 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_device_sysfs_remove(>iommu);
}
-- 
2.17.1



smime.p7s
Description: S/MIME cryptographic signature
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu