On Wed, Jun 13, 2012 at 01:50:17PM +0200, Marek Szyprowski wrote: > This patch adds DMA_ATTR_SKIP_CPU_SYNC attribute to the DMA-mapping > subsystem. > > By default dma_map_{single,page,sg} functions family transfer a given > buffer from CPU domain to device domain. Some advanced use cases might > require sharing a buffer between more than one device. This requires > having a mapping created separately for each device and is usually > performed by calling dma_map_{single,page,sg} function more than once > for the given buffer with device pointer to each device taking part in > the buffer sharing. The first call transfers a buffer from 'CPU' domain > to 'device' domain, what synchronizes CPU caches for the given region > (usually it means that the cache has been flushed or invalidated > depending on the dma direction). However, next calls to > dma_map_{single,page,sg}() for other devices will perform exactly the > same sychronization operation on the CPU cache. CPU cache sychronization > might be a time consuming operation, especially if the buffers are > large, so it is highly recommended to avoid it if possible. > DMA_ATTR_SKIP_CPU_SYNC allows platform code to skip synchronization of > the CPU cache for the given buffer assuming that it has been already > transferred to 'device' domain. This attribute can be also used for > dma_unmap_{single,page,sg} functions family to force buffer to stay in > device domain after releasing a mapping for it. Use this attribute with > care! > > Signed-off-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> > Reviewed-by: Kyungmin Park <kyungmin.park@xxxxxxxxxxx> Curious question: What's the use-case for this? Is this just to work-around the fact that dma-buf atm doesn't support streaming dma so that we could optimize this all (and keep around the mappings)? Or is there a different use-case that I don't see? -Daniel > --- > Documentation/DMA-attributes.txt | 24 ++++++++++++++++++++++++ > include/linux/dma-attrs.h | 1 + > 2 files changed, 25 insertions(+), 0 deletions(-) > > diff --git a/Documentation/DMA-attributes.txt b/Documentation/DMA-attributes.txt > index 725580d..f503090 100644 > --- a/Documentation/DMA-attributes.txt > +++ b/Documentation/DMA-attributes.txt > @@ -67,3 +67,27 @@ set on each call. > Since it is optional for platforms to implement > DMA_ATTR_NO_KERNEL_MAPPING, those that do not will simply ignore the > attribute and exhibit default behavior. > + > +DMA_ATTR_SKIP_CPU_SYNC > +---------------------- > + > +By default dma_map_{single,page,sg} functions family transfer a given > +buffer from CPU domain to device domain. Some advanced use cases might > +require sharing a buffer between more than one device. This requires > +having a mapping created separately for each device and is usually > +performed by calling dma_map_{single,page,sg} function more than once > +for the given buffer with device pointer to each device taking part in > +the buffer sharing. The first call transfers a buffer from 'CPU' domain > +to 'device' domain, what synchronizes CPU caches for the given region > +(usually it means that the cache has been flushed or invalidated > +depending on the dma direction). However, next calls to > +dma_map_{single,page,sg}() for other devices will perform exactly the > +same sychronization operation on the CPU cache. CPU cache sychronization > +might be a time consuming operation, especially if the buffers are > +large, so it is highly recommended to avoid it if possible. > +DMA_ATTR_SKIP_CPU_SYNC allows platform code to skip synchronization of > +the CPU cache for the given buffer assuming that it has been already > +transferred to 'device' domain. This attribute can be also used for > +dma_unmap_{single,page,sg} functions family to force buffer to stay in > +device domain after releasing a mapping for it. Use this attribute with > +care! > diff --git a/include/linux/dma-attrs.h b/include/linux/dma-attrs.h > index a37c10c..f83f793 100644 > --- a/include/linux/dma-attrs.h > +++ b/include/linux/dma-attrs.h > @@ -16,6 +16,7 @@ enum dma_attr { > DMA_ATTR_WRITE_COMBINE, > DMA_ATTR_NON_CONSISTENT, > DMA_ATTR_NO_KERNEL_MAPPING, > + DMA_ATTR_SKIP_CPU_SYNC, > DMA_ATTR_MAX, > }; > > -- > 1.7.1.569.g6f426 > > > _______________________________________________ > Linaro-mm-sig mailing list > Linaro-mm-sig@xxxxxxxxxxxxxxxx > http://lists.linaro.org/mailman/listinfo/linaro-mm-sig -- Daniel Vetter Mail: daniel@xxxxxxxx Mobile: +41 (0)79 365 57 48 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>