Skip to content

Commit f1304f9

Browse files
willdeacongregkh
authored andcommitted
arm64: mm: Don't invalidate FROM_DEVICE buffers at start of DMA transfer
commit c50f11c 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 <[email protected]> Cc: Christoph Hellwig <[email protected]> Cc: Robin Murphy <[email protected]> Cc: Russell King <[email protected]> Cc: <[email protected]> Link: https://lore.kernel.org/r/20220606152150.GA31568@willie-the-truck Signed-off-by: Will Deacon <[email protected]> Reviewed-by: Ard Biesheuvel <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Catalin Marinas <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 7c62218 commit f1304f9

File tree

1 file changed

+0
-2
lines changed

1 file changed

+0
-2
lines changed

arch/arm64/mm/cache.S

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,6 @@ SYM_FUNC_END_PI(__dma_flush_area)
231231
*/
232232
SYM_FUNC_START_PI(__dma_map_area)
233233
add x1, x0, x1
234-
cmp w2, #DMA_FROM_DEVICE
235-
b.eq __dma_inv_area
236234
b __dma_clean_area
237235
SYM_FUNC_END_PI(__dma_map_area)
238236

0 commit comments

Comments
 (0)