From 27dac1e831bc3040c5fec79d1aa1407425916f8a Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 2 Feb 2021 14:02:16 +0100 Subject: [PATCH] 5.4-stable patches 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 --- ...mmu_device-if-iommu_api-is-not-built.patch | 72 ++++++++++++ ...its-with-no-supported-address-widths.patch | 103 ++++++++++++++++++ ...ding-specify-interface-when-invoking.patch | 11 +- queue-5.4/series | 2 + 4 files changed, 179 insertions(+), 9 deletions(-) create mode 100644 queue-5.4/iommu-vt-d-don-t-dereference-iommu_device-if-iommu_api-is-not-built.patch create mode 100644 queue-5.4/iommu-vt-d-gracefully-handle-dmar-units-with-no-supported-address-widths.patch 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 index 00000000000..890b0b1ef52 --- /dev/null +++ b/queue-5.4/iommu-vt-d-don-t-dereference-iommu_device-if-iommu_api-is-not-built.patch @@ -0,0 +1,72 @@ +From foo@baz Tue Feb 2 01:47:48 PM CET 2021 +From: Filippo Sironi +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: +Cc: , , , , Bartosz Golaszewski , Joerg Roedel +Message-ID: <20210202000009.31392-2-sironi@amazon.de> + +From: Bartosz Golaszewski + +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 +Acked-by: Lu Baolu +Acked-by: David Woodhouse +Link: https://lore.kernel.org/r/20201013073055.11262-1-brgl@bgdev.pl +Signed-off-by: Joerg Roedel +[ - 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 +Signed-off-by: Greg Kroah-Hartman +--- + 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 index 00000000000..e537a0381a6 --- /dev/null +++ b/queue-5.4/iommu-vt-d-gracefully-handle-dmar-units-with-no-supported-address-widths.patch @@ -0,0 +1,103 @@ +From foo@baz Tue Feb 2 01:47:48 PM CET 2021 +From: Filippo Sironi +Date: Tue, 2 Feb 2021 01:00:08 +0100 +Subject: iommu/vt-d: Gracefully handle DMAR units with no supported address widths +To: +Cc: , , , , Joerg Roedel +Message-ID: <20210202000009.31392-1-sironi@amazon.de> + +From: David Woodhouse + +commit c40aaaac1018ff1382f2d35df5129a6bcea3df6b upstream. + +Instead of bailing out completely, such a unit can still be used for +interrupt remapping. + +Signed-off-by: David Woodhouse +Reviewed-by: Lu Baolu +Link: https://lore.kernel.org/linux-iommu/549928db2de6532117f36c9c810373c14cf76f51.camel@infradead.org/ +Signed-off-by: Joerg Roedel +[ context change due to moving drivers/iommu/dmar.c to + drivers/iommu/intel/dmar.c ] +Signed-off-by: Filippo Sironi +Signed-off-by: Greg Kroah-Hartman +--- + 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); + } diff --git a/queue-5.4/selftests-forwarding-specify-interface-when-invoking.patch b/queue-5.4/selftests-forwarding-specify-interface-when-invoking.patch index c70569c859f..ab9a7437844 100644 --- a/queue-5.4/selftests-forwarding-specify-interface-when-invoking.patch +++ b/queue-5.4/selftests-forwarding-specify-interface-when-invoking.patch @@ -18,12 +18,10 @@ Signed-off-by: Ido Schimmel Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- - 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 - diff --git a/queue-5.4/series b/queue-5.4/series index a29ea1c39f0..73dacce52cc 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -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 -- 2.47.3