Skip to content

Commit c50f11c

Browse files
willdeaconctmarinas
authored andcommitted
arm64: mm: Don't invalidate FROM_DEVICE buffers at start of DMA transfer
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]>
1 parent 3f77a1d commit c50f11c

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
@@ -218,8 +218,6 @@ SYM_FUNC_ALIAS(__dma_flush_area, __pi___dma_flush_area)
218218
*/
219219
SYM_FUNC_START(__pi___dma_map_area)
220220
add x1, x0, x1
221-
cmp w2, #DMA_FROM_DEVICE
222-
b.eq __pi_dcache_inval_poc
223221
b __pi_dcache_clean_poc
224222
SYM_FUNC_END(__pi___dma_map_area)
225223
SYM_FUNC_ALIAS(__dma_map_area, __pi___dma_map_area)

0 commit comments

Comments
 (0)