From: Greg Kroah-Hartman Date: Tue, 2 Feb 2021 13:06:09 +0000 (+0100) Subject: 4.4-stable patches X-Git-Tag: v4.4.255~11 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=024b690d2b4c16cc883d88ad64444a6f08b01c40;p=thirdparty%2Fkernel%2Fstable-queue.git 4.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 --- diff --git a/queue-4.4/iommu-vt-d-don-t-dereference-iommu_device-if-iommu_api-is-not-built.patch b/queue-4.4/iommu-vt-d-don-t-dereference-iommu_device-if-iommu_api-is-not-built.patch new file mode 100644 index 00000000000..2856c49d4f9 --- /dev/null +++ b/queue-4.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 02:03:57 PM CET 2021 +From: Filippo Sironi +Date: Tue, 2 Feb 2021 01:09:37 +0100 +Subject: iommu/vt-d: Don't dereference iommu_device if IOMMU_API is not built +To: +Cc: , , , , Bartosz Golaszewski , Joerg Roedel +Message-ID: <20210202000937.2151-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 +@@ -1087,6 +1087,7 @@ static int alloc_iommu(struct dmar_drhd_ + raw_spin_lock_init(&iommu->register_lock); + + drhd->iommu = iommu; ++ iommu->drhd = drhd; + + if (intel_iommu_enabled && !drhd->ignored) + iommu->iommu_dev = iommu_device_create(NULL, iommu, +@@ -1104,7 +1105,7 @@ error: + + static void free_iommu(struct intel_iommu *iommu) + { +- if (intel_iommu_enabled && iommu->iommu_dev) ++ if (intel_iommu_enabled && !iommu->drhd->ignored) + iommu_device_destroy(iommu->iommu_dev); + + if (iommu->irq) { +--- a/include/linux/intel-iommu.h ++++ b/include/linux/intel-iommu.h +@@ -447,6 +447,8 @@ struct intel_iommu { + struct device *iommu_dev; /* IOMMU-sysfs device */ + int node; + u32 flags; /* Software defined flags */ ++ ++ struct dmar_drhd_unit *drhd; + }; + + static inline void __iommu_flush_cache( diff --git a/queue-4.4/iommu-vt-d-gracefully-handle-dmar-units-with-no-supported-address-widths.patch b/queue-4.4/iommu-vt-d-gracefully-handle-dmar-units-with-no-supported-address-widths.patch new file mode 100644 index 00000000000..b105ef8b6da --- /dev/null +++ b/queue-4.4/iommu-vt-d-gracefully-handle-dmar-units-with-no-supported-address-widths.patch @@ -0,0 +1,110 @@ +From foo@baz Tue Feb 2 02:03:57 PM CET 2021 +From: Filippo Sironi +Date: Tue, 2 Feb 2021 01:09:36 +0100 +Subject: iommu/vt-d: Gracefully handle DMAR units with no supported address widths +To: +Cc: , , , , Joerg Roedel +Message-ID: <20210202000937.2151-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 + - remove the unused err_unmap label + - use iommu->iommu_dev instead of iommu->iommu.ops to decide whether + when freeing ] +Signed-off-by: Filippo Sironi +Signed-off-by: Greg Kroah-Hartman +--- + drivers/iommu/dmar.c | 44 +++++++++++++++++++++++++++----------------- + 1 file changed, 27 insertions(+), 17 deletions(-) + +--- a/drivers/iommu/dmar.c ++++ b/drivers/iommu/dmar.c +@@ -1012,8 +1012,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) { +@@ -1038,17 +1038,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; +@@ -1077,15 +1088,13 @@ static int alloc_iommu(struct dmar_drhd_ + + drhd->iommu = iommu; + +- if (intel_iommu_enabled) ++ if (intel_iommu_enabled && !drhd->ignored) + iommu->iommu_dev = iommu_device_create(NULL, iommu, + intel_iommu_groups, + "%s", iommu->name); + + return 0; + +-err_unmap: +- unmap_iommu(iommu); + error_free_seq_id: + dmar_free_seq_id(iommu); + error: +@@ -1095,7 +1104,8 @@ error: + + static void free_iommu(struct intel_iommu *iommu) + { +- iommu_device_destroy(iommu->iommu_dev); ++ if (intel_iommu_enabled && iommu->iommu_dev) ++ iommu_device_destroy(iommu->iommu_dev); + + if (iommu->irq) { + if (iommu->pr_irq) { diff --git a/queue-4.4/series b/queue-4.4/series index deab827296a..bc84ef11ccc 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -22,3 +22,5 @@ xfrm-fix-oops-in-xfrm_replay_advance_bmp.patch rdma-cxgb4-fix-the-reported-max_recv_sge-value.patch mac80211-pause-tx-while-changing-interface-type.patch can-dev-prevent-potential-information-leak-in-can_fi.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