linux/arch/arm64/mm
Will Deacon 1a264b3a69 arm64: mm: Don't invalidate FROM_DEVICE buffers at start of DMA transfer
commit c50f11c619 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>
2022-06-25 15:16:09 +02:00
..
cache.S arm64: mm: Don't invalidate FROM_DEVICE buffers at start of DMA transfer 2022-06-25 15:16:09 +02:00
context.c arm64: mm: Pin down ASIDs for sharing mm with devices 2020-09-28 22:15:38 +01:00
copypage.c arm64: fix types in copy_highpage() 2022-06-09 10:21:06 +02:00
dma-mapping.c dma-mapping: merge <linux/dma-noncoherent.h> into <linux/dma-map-ops.h> 2020-10-06 07:07:06 +02:00
extable.c arm64: Improve diagnostics when trapping BRK with FAULT_BRK_IMM 2020-09-18 16:35:54 +01:00
fault.c arm64: entry: fix EL1 debug transitions 2020-11-30 12:11:38 +00:00
flush.c arm64: Fix race condition on PG_dcache_clean in __sync_icache_dcache() 2021-05-19 10:13:11 +02:00
hugetlbpage.c arm64/hugetlb: fix CMA gigantic page order for non-4K PAGE_SIZE 2021-10-20 11:44:58 +02:00
init.c arm64: Do not defer reserve_crashkernel() for platforms with no DMA memory zones 2022-04-08 14:40:45 +02:00
ioremap.c arm[64]/memremap: don't abuse pfn_valid() to ensure presence of linear map 2022-05-18 10:23:48 +02:00
kasan_init.c arch, drivers: replace for_each_membock() with for_each_mem_range() 2020-10-13 18:38:35 -07:00
Makefile Merge branch 'for-next/mte' into for-next/core 2020-10-02 12:16:11 +01:00
mmap.c arm64, mm: move generic mmap layout functions to mm 2019-09-24 15:54:11 -07:00
mmu.c arm64: Do not defer reserve_crashkernel() for platforms with no DMA memory zones 2022-04-08 14:40:45 +02:00
mteswap.c arm64: mte: Enable swap of tagged pages 2020-09-04 12:46:07 +01:00
numa.c memblock: use separate iterators for memory and reserved regions 2020-10-13 18:38:35 -07:00
pageattr.c arm64: mm: Fix missing-prototypes in pageattr.c 2020-09-18 14:33:46 +01:00
pgd.c mm: consolidate pgtable_cache_init() and pgd_cache_init() 2019-09-24 15:54:09 -07:00
physaddr.c arm64: Do not pass tagged addresses to __is_lm_address() 2021-02-07 15:37:13 +01:00
proc.S arm64: consistently use reserved_pg_dir 2021-07-14 16:56:06 +02:00
ptdump_debugfs.c arm64/mm: Hold memory hotplug lock while walking for kernel page table dump 2020-03-04 15:35:22 +00:00
ptdump.c Merge branch 'for-next/mte' into for-next/core 2020-10-02 12:16:11 +01:00