summarylogtreecommitdiffstats
path: root/0106-arm64-mm-Don-t-invalidate-FROM_DEVICE-buffers-at-sta.patch
diff options
context:
space:
mode:
Diffstat (limited to '0106-arm64-mm-Don-t-invalidate-FROM_DEVICE-buffers-at-sta.patch')
-rw-r--r--0106-arm64-mm-Don-t-invalidate-FROM_DEVICE-buffers-at-sta.patch57
1 files changed, 57 insertions, 0 deletions
diff --git a/0106-arm64-mm-Don-t-invalidate-FROM_DEVICE-buffers-at-sta.patch b/0106-arm64-mm-Don-t-invalidate-FROM_DEVICE-buffers-at-sta.patch
new file mode 100644
index 000000000000..a803b1f45a97
--- /dev/null
+++ b/0106-arm64-mm-Don-t-invalidate-FROM_DEVICE-buffers-at-sta.patch
@@ -0,0 +1,57 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Will Deacon <will@kernel.org>
+Date: Fri, 10 Jun 2022 16:12:27 +0100
+Subject: [PATCH] arm64: mm: Don't invalidate FROM_DEVICE buffers at start of
+ DMA transfer
+
+commit c50f11c6196f45c92ca48b16a5071615d4ae0572 upstream.
+
+Invalidating the buffer memory in arch_sync_dma_for_device() for
+FROM_DEVICE transfers
+
+When using the streaming DMA API to map a buffer prior to inbound
+non-coherent DMA (i.e. DMA_FROM_DEVICE), we invalidate any dirty CPU
+cachelines so that they will not be written back during the transfer and
+corrupt the buffer contents written by the DMA. This, however, poses two
+potential problems:
+
+ (1) If the DMA transfer does not write to every byte in the buffer,
+ then the unwritten bytes will contain stale data once the transfer
+ has completed.
+
+ (2) If the buffer has a virtual alias in userspace, then stale data
+ may be visible via this alias during the period between performing
+ the cache invalidation and the DMA writes landing in memory.
+
+Address both of these issues by cleaning (aka writing-back) the dirty
+lines in arch_sync_dma_for_device(DMA_FROM_DEVICE) instead of discarding
+them using invalidation.
+
+Cc: Ard Biesheuvel <ardb@kernel.org>
+Cc: Christoph Hellwig <hch@lst.de>
+Cc: Robin Murphy <robin.murphy@arm.com>
+Cc: Russell King <linux@armlinux.org.uk>
+Cc: <stable@vger.kernel.org>
+Link: https://lore.kernel.org/r/20220606152150.GA31568@willie-the-truck
+Signed-off-by: Will Deacon <will@kernel.org>
+Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
+Link: https://lore.kernel.org/r/20220610151228.4562-2-will@kernel.org
+Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/arm64/mm/cache.S | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/arch/arm64/mm/cache.S b/arch/arm64/mm/cache.S
+index 0ea6cc25dc66356de86d262cc3d48bb993ec3cd0..21c907987080f60d4b25ef70f438332a6c1c24cc 100644
+--- a/arch/arm64/mm/cache.S
++++ b/arch/arm64/mm/cache.S
+@@ -218,8 +218,6 @@ SYM_FUNC_ALIAS(__dma_flush_area, __pi___dma_flush_area)
+ */
+ SYM_FUNC_START(__pi___dma_map_area)
+ add x1, x0, x1
+- cmp w2, #DMA_FROM_DEVICE
+- b.eq __pi_dcache_inval_poc
+ b __pi_dcache_clean_poc
+ SYM_FUNC_END(__pi___dma_map_area)
+ SYM_FUNC_ALIAS(__dma_map_area, __pi___dma_map_area)