From: Greg Kroah-Hartman Date: Tue, 2 Feb 2021 13:06:25 +0000 (+0100) Subject: 4.9-stable patches X-Git-Tag: v4.4.255~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6cb83693195902a15015371dce0f917e3d2619fd;p=thirdparty%2Fkernel%2Fstable-queue.git 4.9-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.9/can-dev-prevent-potential-information-leak-in-can_fi.patch b/queue-4.9/can-dev-prevent-potential-information-leak-in-can_fi.patch index 84065456eed..9c2e95b23bc 100644 --- a/queue-4.9/can-dev-prevent-potential-information-leak-in-can_fi.patch +++ b/queue-4.9/can-dev-prevent-potential-information-leak-in-can_fi.patch @@ -17,14 +17,12 @@ Signed-off-by: Dan Carpenter Signed-off-by: Marc Kleine-Budde Signed-off-by: Sasha Levin --- - drivers/net/can/dev.c | 2 +- + drivers/net/can/dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c -index 164078609f98e..ea38b67d0b737 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c -@@ -1017,7 +1017,7 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev) +@@ -1017,7 +1017,7 @@ static int can_fill_info(struct sk_buff { struct can_priv *priv = netdev_priv(dev); struct can_ctrlmode cm = {.flags = priv->ctrlmode}; @@ -33,6 +31,3 @@ index 164078609f98e..ea38b67d0b737 100644 enum can_state state = priv->state; if (priv->do_get_state) --- -2.27.0 - diff --git a/queue-4.9/iommu-vt-d-don-t-dereference-iommu_device-if-iommu_api-is-not-built.patch b/queue-4.9/iommu-vt-d-don-t-dereference-iommu_device-if-iommu_api-is-not-built.patch new file mode 100644 index 00000000000..232ac562d87 --- /dev/null +++ b/queue-4.9/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:22 PM CET 2021 +From: Filippo Sironi +Date: Tue, 2 Feb 2021 01:07:07 +0100 +Subject: iommu/vt-d: Don't dereference iommu_device if IOMMU_API is not built +To: +Cc: , , , , Bartosz Golaszewski , Joerg Roedel +Message-ID: <20210202000707.1696-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 +@@ -1110,6 +1110,7 @@ static int alloc_iommu(struct dmar_drhd_ + } + + drhd->iommu = iommu; ++ iommu->drhd = drhd; + + return 0; + +@@ -1124,7 +1125,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.9/iommu-vt-d-gracefully-handle-dmar-units-with-no-supported-address-widths.patch b/queue-4.9/iommu-vt-d-gracefully-handle-dmar-units-with-no-supported-address-widths.patch new file mode 100644 index 00000000000..7bc4ca13bc9 --- /dev/null +++ b/queue-4.9/iommu-vt-d-gracefully-handle-dmar-units-with-no-supported-address-widths.patch @@ -0,0 +1,101 @@ +From foo@baz Tue Feb 2 02:03:22 PM CET 2021 +From: Filippo Sironi +Date: Tue, 2 Feb 2021 01:07:06 +0100 +Subject: iommu/vt-d: Gracefully handle DMAR units with no supported address widths +To: +Cc: , , , , Joerg Roedel +Message-ID: <20210202000707.1696-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 + - 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 | 42 +++++++++++++++++++++++++++--------------- + 1 file changed, 27 insertions(+), 15 deletions(-) + +--- a/drivers/iommu/dmar.c ++++ b/drivers/iommu/dmar.c +@@ -1024,8 +1024,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) { +@@ -1050,17 +1050,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; +@@ -1087,7 +1098,7 @@ static int alloc_iommu(struct dmar_drhd_ + + raw_spin_lock_init(&iommu->register_lock); + +- if (intel_iommu_enabled) { ++ if (intel_iommu_enabled && !drhd->ignored) { + iommu->iommu_dev = iommu_device_create(NULL, iommu, + intel_iommu_groups, + "%s", iommu->name); +@@ -1113,7 +1124,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.9/series b/queue-4.9/series index fb1a5f3a03e..182bc53081d 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -26,3 +26,5 @@ iwlwifi-pcie-use-jiffies-for-memory-read-spin-time-l.patch iwlwifi-pcie-reschedule-in-long-running-memory-reads.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