Re: [PATCH] swiotlb: sync buffer when mapping FROM_DEVICE

From: Robin Murphy
Date: Wed May 22 2019 - 09:28:27 EST


On 2019-05-22 2:09 pm, Christoph Hellwig wrote:
On Wed, May 22, 2019 at 01:50:47PM +0100, Robin Murphy wrote:
Would that work out any different from the existing DMA_ATTR_SKIP_CPU_SYNC?

If drivers are prepared to handle this issue from their end, they can
already do so for single mappings by using that attr along with explicit
partial syncs via dma_sync_single(). For page/sg mappings we'd still have
the problem of identifying what part of "partial" actually matters, and
probably having to add some additional new sync operations to cope.

Except that the same optimization we are tripping over here is also
present in dma_sync_* - dma_sync_*_to_device with DMA_FROM_DEVICE is a
no-op in swiotlb.

Sure, but that should be irrelevant since the effective problem here is in the sync_*_for_cpu direction, and it's the unmap which nobbles the buffer. If the driver does this:

dma_map_single(whole buffer);
<device writes to part of buffer>
dma_unmap_single(whole buffer);
<contents of rest of buffer now undefined>

then it could instead do this and be happy:

dma_map_single(whole buffer, SKIP_CPU_SYNC);
<device writes to part of buffer>
dma_sync_single_for_cpu(updated part of buffer);
dma_unmap_single(whole buffer, SKIP_CPU_SYNC);
<contents of rest of buffer still valid>

Robin.