[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <fdfd7318-7999-1fe6-01b6-ae1fb7ba8c30@arm.com>
Date: Wed, 22 May 2019 14:25:38 +0100
From: Robin Murphy <robin.murphy@....com>
To: Christoph Hellwig <hch@....de>
Cc: Horia Geantă <horia.geanta@....com>,
Konrad Rzeszutek Wilk <konrad.wilk@...cle.com>,
Marek Szyprowski <m.szyprowski@...sung.com>,
iommu@...ts.linux-foundation.org, linux-kernel@...r.kernel.org,
linux-imx@....com
Subject: Re: [PATCH] swiotlb: sync buffer when mapping FROM_DEVICE
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.
Powered by blists - more mailing lists