lkml.org 
[lkml]   [2019]   [May]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: [PATCH] swiotlb: sync buffer when mapping FROM_DEVICE
From
Date
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.

\
 
 \ /
  Last update: 2019-05-22 15:26    [W:0.254 / U:0.028 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site