Message ID | 1339588218-24398-6-git-send-email-m.szyprowski@samsung.com |
---|---|
State | Accepted |
Commit | bdf5e4871f1b41150236e2337837399109469e65 |
Headers | show |
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@samsung.com> > Reviewed-by: Kyungmin Park <kyungmin.park@samsung.com> 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@lists.linaro.org > http://lists.linaro.org/mailman/listinfo/linaro-mm-sig
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, };