]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 2 Feb 2021 13:02:16 +0000 (14:02 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 2 Feb 2021 13:02:16 +0000 (14:02 +0100)
added patches:
iommu-vt-d-don-t-dereference-iommu_device-if-iommu_api-is-not-built.patch
iommu-vt-d-gracefully-handle-dmar-units-with-no-supported-address-widths.patch

queue-5.4/iommu-vt-d-don-t-dereference-iommu_device-if-iommu_api-is-not-built.patch [new file with mode: 0644]
queue-5.4/iommu-vt-d-gracefully-handle-dmar-units-with-no-supported-address-widths.patch [new file with mode: 0644]
queue-5.4/selftests-forwarding-specify-interface-when-invoking.patch
queue-5.4/series

diff --git a/queue-5.4/iommu-vt-d-don-t-dereference-iommu_device-if-iommu_api-is-not-built.patch b/queue-5.4/iommu-vt-d-don-t-dereference-iommu_device-if-iommu_api-is-not-built.patch
new file mode 100644 (file)
index 0000000..890b0b1
--- /dev/null
@@ -0,0 +1,72 @@
+From foo@baz Tue Feb  2 01:47:48 PM CET 2021
+From: Filippo Sironi <sironi@amazon.de>
+Date: Tue, 2 Feb 2021 01:00:09 +0100
+Subject: iommu/vt-d: Don't dereference iommu_device if IOMMU_API is not built
+To: <gregkh@linuxfoundation.org>
+Cc: <stable@vger.kernel.org>, <samjonas@amazon.com>, <dwmw@amazon.co.uk>, <sironi@amazon.de>, Bartosz Golaszewski <bgolaszewski@baylibre.com>, Joerg Roedel <jroedel@suse.de>
+Message-ID: <20210202000009.31392-2-sironi@amazon.de>
+
+From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
+
+commit 9def3b1a07c41e21c68a0eb353e3e569fdd1d2b1 upstream.
+
+Since commit c40aaaac1018 ("iommu/vt-d: Gracefully handle DMAR units
+with no supported address widths") dmar.c needs struct iommu_device to
+be selected. We can drop this dependency by not dereferencing struct
+iommu_device if IOMMU_API is not selected and by reusing the information
+stored in iommu->drhd->ignored instead.
+
+This fixes the following build error when IOMMU_API is not selected:
+
+drivers/iommu/dmar.c: In function ‘free_iommu’:
+drivers/iommu/dmar.c:1139:41: error: ‘struct iommu_device’ has no member named ‘ops’
+ 1139 |  if (intel_iommu_enabled && iommu->iommu.ops) {
+                                                ^
+
+Fixes: c40aaaac1018 ("iommu/vt-d: Gracefully handle DMAR units with no supported address widths")
+Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
+Acked-by: Lu Baolu <baolu.lu@linux.intel.com>
+Acked-by: David Woodhouse <dwmw@amazon.co.uk>
+Link: https://lore.kernel.org/r/20201013073055.11262-1-brgl@bgdev.pl
+Signed-off-by: Joerg Roedel <jroedel@suse.de>
+[ - context change due to moving drivers/iommu/dmar.c to
+    drivers/iommu/intel/dmar.c
+  - set the drhr in the iommu like in upstream commit b1012ca8dc4f
+    ("iommu/vt-d: Skip TE disabling on quirky gfx dedicated iommu") ]
+Signed-off-by: Filippo Sironi <sironi@amazon.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/iommu/dmar.c        |    3 ++-
+ include/linux/intel-iommu.h |    2 ++
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+--- a/drivers/iommu/dmar.c
++++ b/drivers/iommu/dmar.c
+@@ -1114,6 +1114,7 @@ static int alloc_iommu(struct dmar_drhd_
+       }
+       drhd->iommu = iommu;
++      iommu->drhd = drhd;
+       return 0;
+@@ -1128,7 +1129,7 @@ error:
+ static void free_iommu(struct intel_iommu *iommu)
+ {
+-      if (intel_iommu_enabled && iommu->iommu.ops) {
++      if (intel_iommu_enabled && !iommu->drhd->ignored) {
+               iommu_device_unregister(&iommu->iommu);
+               iommu_device_sysfs_remove(&iommu->iommu);
+       }
+--- a/include/linux/intel-iommu.h
++++ b/include/linux/intel-iommu.h
+@@ -556,6 +556,8 @@ struct intel_iommu {
+       struct iommu_device iommu;  /* IOMMU core code handle */
+       int             node;
+       u32             flags;      /* Software defined flags */
++
++      struct dmar_drhd_unit *drhd;
+ };
+ /* PCI domain-device relationship */
diff --git a/queue-5.4/iommu-vt-d-gracefully-handle-dmar-units-with-no-supported-address-widths.patch b/queue-5.4/iommu-vt-d-gracefully-handle-dmar-units-with-no-supported-address-widths.patch
new file mode 100644 (file)
index 0000000..e537a03
--- /dev/null
@@ -0,0 +1,103 @@
+From foo@baz Tue Feb  2 01:47:48 PM CET 2021
+From: Filippo Sironi <sironi@amazon.de>
+Date: Tue, 2 Feb 2021 01:00:08 +0100
+Subject: iommu/vt-d: Gracefully handle DMAR units with no supported address widths
+To: <gregkh@linuxfoundation.org>
+Cc: <stable@vger.kernel.org>, <samjonas@amazon.com>, <dwmw@amazon.co.uk>, <sironi@amazon.de>, Joerg Roedel <jroedel@suse.de>
+Message-ID: <20210202000009.31392-1-sironi@amazon.de>
+
+From: David Woodhouse <dwmw@amazon.co.uk>
+
+commit c40aaaac1018ff1382f2d35df5129a6bcea3df6b upstream.
+
+Instead of bailing out completely, such a unit can still be used for
+interrupt remapping.
+
+Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
+Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
+Link: https://lore.kernel.org/linux-iommu/549928db2de6532117f36c9c810373c14cf76f51.camel@infradead.org/
+Signed-off-by: Joerg Roedel <jroedel@suse.de>
+[ context change due to moving drivers/iommu/dmar.c to
+  drivers/iommu/intel/dmar.c ]
+Signed-off-by: Filippo Sironi <sironi@amazon.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/iommu/dmar.c |   46 +++++++++++++++++++++++++++++++---------------
+ 1 file changed, 31 insertions(+), 15 deletions(-)
+
+--- a/drivers/iommu/dmar.c
++++ b/drivers/iommu/dmar.c
+@@ -1020,8 +1020,8 @@ static int alloc_iommu(struct dmar_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) {
+@@ -1046,17 +1046,28 @@ static int alloc_iommu(struct dmar_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;
+@@ -1083,7 +1094,12 @@ static int alloc_iommu(struct dmar_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);
+@@ -1112,7 +1128,7 @@ error:
+ 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);
+       }
index c70569c859fa3dd4e81c3270976664bc391434f3..ab9a743784406d395392c0688b06be028d1cb5cc 100644 (file)
@@ -18,12 +18,10 @@ Signed-off-by: Ido Schimmel <idosch@nvidia.com>
 Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 Signed-off-by: Sasha Levin <sashal@kernel.org>
 ---
- tools/testing/selftests/net/forwarding/router_mpath_nh.sh  | 2 +-
- tools/testing/selftests/net/forwarding/router_multipath.sh | 2 +-
+ tools/testing/selftests/net/forwarding/router_mpath_nh.sh  |    2 +-
+ tools/testing/selftests/net/forwarding/router_multipath.sh |    2 +-
  2 files changed, 2 insertions(+), 2 deletions(-)
 
-diff --git a/tools/testing/selftests/net/forwarding/router_mpath_nh.sh b/tools/testing/selftests/net/forwarding/router_mpath_nh.sh
-index cf3d26c233e8e..7fcc42bc076fa 100755
 --- a/tools/testing/selftests/net/forwarding/router_mpath_nh.sh
 +++ b/tools/testing/selftests/net/forwarding/router_mpath_nh.sh
 @@ -197,7 +197,7 @@ multipath4_test()
@@ -35,8 +33,6 @@ index cf3d26c233e8e..7fcc42bc076fa 100755
                -d 1msec -t udp "sp=1024,dp=0-32768"
  
        t1_rp12=$(link_stats_tx_packets_get $rp12)
-diff --git a/tools/testing/selftests/net/forwarding/router_multipath.sh b/tools/testing/selftests/net/forwarding/router_multipath.sh
-index 79a2099279621..464821c587a5e 100755
 --- a/tools/testing/selftests/net/forwarding/router_multipath.sh
 +++ b/tools/testing/selftests/net/forwarding/router_multipath.sh
 @@ -178,7 +178,7 @@ multipath4_test()
@@ -48,6 +44,3 @@ index 79a2099279621..464821c587a5e 100755
               -d 1msec -t udp "sp=1024,dp=0-32768"
  
         t1_rp12=$(link_stats_tx_packets_get $rp12)
--- 
-2.27.0
-
index a29ea1c39f0f7441358294f9137fc3a2cbcadf7e..73dacce52cced91f37d632c1b750336c0069390f 100644 (file)
@@ -51,3 +51,5 @@ net-mlx5e-reduce-tc-unsupported-key-print-level.patch
 can-dev-prevent-potential-information-leak-in-can_fi.patch
 nvme-multipath-early-exit-if-no-path-is-available.patch
 selftests-forwarding-specify-interface-when-invoking.patch
+iommu-vt-d-gracefully-handle-dmar-units-with-no-supported-address-widths.patch
+iommu-vt-d-don-t-dereference-iommu_device-if-iommu_api-is-not-built.patch