Messages in this thread | | | Subject | Re: [PATCH] swiotlb: sync buffer when mapping FROM_DEVICE | From | Robin Murphy <> | Date | Wed, 22 May 2019 14:25:38 +0100 |
| |
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.
| |