From: Greg Kroah-Hartman Date: Mon, 21 Sep 2020 15:42:56 +0000 (+0200) Subject: 4.4-stable patches X-Git-Tag: v4.4.237~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2103e1008e383fadaaba8e4a5a1d986304d59b6f;p=thirdparty%2Fkernel%2Fstable-queue.git 4.4-stable patches added patches: ehci-hcd-move-include-to-keep-crc-stable.patch powerpc-dma-fix-dma_map_ops-get_required_mask.patch --- diff --git a/queue-4.4/ehci-hcd-move-include-to-keep-crc-stable.patch b/queue-4.4/ehci-hcd-move-include-to-keep-crc-stable.patch new file mode 100644 index 00000000000..52fc3323037 --- /dev/null +++ b/queue-4.4/ehci-hcd-move-include-to-keep-crc-stable.patch @@ -0,0 +1,88 @@ +From 29231826f3bd65500118c473fccf31c0cf14dbc0 Mon Sep 17 00:00:00 2001 +From: Quentin Perret +Date: Wed, 16 Sep 2020 18:18:25 +0100 +Subject: ehci-hcd: Move include to keep CRC stable + +From: Quentin Perret + +commit 29231826f3bd65500118c473fccf31c0cf14dbc0 upstream. + +The CRC calculation done by genksyms is triggered when the parser hits +EXPORT_SYMBOL*() macros. At this point, genksyms recursively expands the +types of the function parameters, and uses that as the input for the CRC +calculation. In the case of forward-declared structs, the type expands +to 'UNKNOWN'. Following this, it appears that the result of the +expansion of each type is cached somewhere, and seems to be re-used +when/if the same type is seen again for another exported symbol in the +same C file. + +Unfortunately, this can cause CRC 'stability' issues when a struct +definition becomes visible in the middle of a C file. For example, let's +assume code with the following pattern: + + struct foo; + + int bar(struct foo *arg) + { + /* Do work ... */ + } + EXPORT_SYMBOL_GPL(bar); + + /* This contains struct foo's definition */ + #include "foo.h" + + int baz(struct foo *arg) + { + /* Do more work ... */ + } + EXPORT_SYMBOL_GPL(baz); + +Here, baz's CRC will be computed using the expansion of struct foo that +was cached after bar's CRC calculation ('UNKOWN' here). But if +EXPORT_SYMBOL_GPL(bar) is removed from the file (because of e.g. symbol +trimming using CONFIG_TRIM_UNUSED_KSYMS), struct foo will be expanded +late, during baz's CRC calculation, which now has visibility over the +full struct definition, hence resulting in a different CRC for baz. + +The proper fix for this certainly is in genksyms, but that will take me +some time to get right. In the meantime, we have seen one occurrence of +this in the ehci-hcd code which hits this problem because of the way it +includes C files halfway through the code together with an unlucky mix +of symbol trimming. + +In order to workaround this, move the include done in ehci-hub.c early +in ehci-hcd.c, hence making sure the struct definitions are visible to +the entire file. This improves CRC stability of the ehci-hcd exports +even when symbol trimming is enabled. + +Acked-by: Alan Stern +Cc: stable +Signed-off-by: Quentin Perret +Link: https://lore.kernel.org/r/20200916171825.3228122-1-qperret@google.com +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/host/ehci-hcd.c | 1 + + drivers/usb/host/ehci-hub.c | 1 - + 2 files changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/usb/host/ehci-hcd.c ++++ b/drivers/usb/host/ehci-hcd.c +@@ -35,6 +35,7 @@ + #include + #include + #include ++#include + #include + #include + #include +--- a/drivers/usb/host/ehci-hub.c ++++ b/drivers/usb/host/ehci-hub.c +@@ -27,7 +27,6 @@ + */ + + /*-------------------------------------------------------------------------*/ +-#include + + #define PORT_WAKE_BITS (PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E) + diff --git a/queue-4.4/powerpc-dma-fix-dma_map_ops-get_required_mask.patch b/queue-4.4/powerpc-dma-fix-dma_map_ops-get_required_mask.patch new file mode 100644 index 00000000000..fddb434458b --- /dev/null +++ b/queue-4.4/powerpc-dma-fix-dma_map_ops-get_required_mask.patch @@ -0,0 +1,50 @@ +From 437ef802e0adc9f162a95213a3488e8646e5fc03 Mon Sep 17 00:00:00 2001 +From: Alexey Kardashevskiy +Date: Tue, 8 Sep 2020 11:51:06 +1000 +Subject: powerpc/dma: Fix dma_map_ops::get_required_mask + +From: Alexey Kardashevskiy + +commit 437ef802e0adc9f162a95213a3488e8646e5fc03 upstream. + +There are 2 problems with it: + 1. "<" vs expected "<<" + 2. the shift number is an IOMMU page number mask, not an address + mask as the IOMMU page shift is missing. + +This did not hit us before f1565c24b596 ("powerpc: use the generic +dma_ops_bypass mode") because we had additional code to handle bypass +mask so this chunk (almost?) never executed.However there were +reports that aacraid does not work with "iommu=nobypass". + +After f1565c24b596, aacraid (and probably others which call +dma_get_required_mask() before setting the mask) was unable to enable +64bit DMA and fall back to using IOMMU which was known not to work, +one of the problems is double free of an IOMMU page. + +This fixes DMA for aacraid, both with and without "iommu=nobypass" in +the kernel command line. Verified with "stress-ng -d 4". + +Fixes: 6a5c7be5e484 ("powerpc: Override dma_get_required_mask by platform hook and ops") +Cc: stable@vger.kernel.org # v3.2+ +Signed-off-by: Alexey Kardashevskiy +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20200908015106.79661-1-aik@ozlabs.ru +Signed-off-by: Greg Kroah-Hartman + +--- + arch/powerpc/kernel/dma-iommu.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/arch/powerpc/kernel/dma-iommu.c ++++ b/arch/powerpc/kernel/dma-iommu.c +@@ -99,7 +99,8 @@ static u64 dma_iommu_get_required_mask(s + if (!tbl) + return 0; + +- mask = 1ULL < (fls_long(tbl->it_offset + tbl->it_size) - 1); ++ mask = 1ULL << (fls_long(tbl->it_offset + tbl->it_size) + ++ tbl->it_page_shift - 1); + mask += mask - 1; + + return mask; diff --git a/queue-4.4/series b/queue-4.4/series index 17115552d0c..03daf7a8a7b 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -41,3 +41,5 @@ usb-uas-fix-disconnect-by-unplugging-a-hub.patch usblp-fix-race-between-disconnect-and-read.patch input-i8042-add-entroware-proteus-el07r4-to-nomux-and-reset-lists.patch serial-8250_pci-add-realtek-816a-and-816b.patch +ehci-hcd-move-include-to-keep-crc-stable.patch +powerpc-dma-fix-dma_map_ops-get_required_mask.patch