summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2019-07-08 09:07:42 -0400
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>2019-07-23 11:46:27 -0400
commit596a5a58e89a4bfe0d8a275ab552de990b18f0ac (patch)
tree3446af715a7c8fb4e68c6ea1676772f03ddc2f25
parent81f96ebc8a663869948c197c60f0356f247ac91c (diff)
media: vb2-dc: skip CPU sync in map/unmap dma_buf
This is rougly equivalent to ca0e68e21aae (drm/prime: skip CPU sync in map/unmap dma_buf). The contig memory allocated is already device coherent memory, so there is no point in doing a CPU sync when mapping it to another device. Also most importers currently cache the mapping so the CPU sync would only happen on the first import, so we are better off with not pretending to do a cache synchronization at all. This gets rid of a lot of CPU overhead in uses where those dma-bufs are regularily imported and detached again, like Weston is currently doing in the DRM compositor. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Acked-by: Marek Szyprowski <m.szyprowski@samsung.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> [hverkuil-cisco@xs4all.nl: fix checkpatch warnings] Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
-rw-r--r--drivers/media/common/videobuf2/videobuf2-dma-contig.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/drivers/media/common/videobuf2/videobuf2-dma-contig.c b/drivers/media/common/videobuf2/videobuf2-dma-contig.c
index 7d77e4d30c8a..44cd0e530bbd 100644
--- a/drivers/media/common/videobuf2/videobuf2-dma-contig.c
+++ b/drivers/media/common/videobuf2/videobuf2-dma-contig.c
@@ -267,8 +267,14 @@ static void vb2_dc_dmabuf_ops_detach(struct dma_buf *dbuf,
267 267
268 /* release the scatterlist cache */ 268 /* release the scatterlist cache */
269 if (attach->dma_dir != DMA_NONE) 269 if (attach->dma_dir != DMA_NONE)
270 dma_unmap_sg(db_attach->dev, sgt->sgl, sgt->orig_nents, 270 /*
271 attach->dma_dir); 271 * Cache sync can be skipped here, as the vb2_dc memory is
272 * allocated from device coherent memory, which means the
273 * memory locations do not require any explicit cache
274 * maintenance prior or after being used by the device.
275 */
276 dma_unmap_sg_attrs(db_attach->dev, sgt->sgl, sgt->orig_nents,
277 attach->dma_dir, DMA_ATTR_SKIP_CPU_SYNC);
272 sg_free_table(sgt); 278 sg_free_table(sgt);
273 kfree(attach); 279 kfree(attach);
274 db_attach->priv = NULL; 280 db_attach->priv = NULL;
@@ -293,14 +299,17 @@ static struct sg_table *vb2_dc_dmabuf_ops_map(
293 299
294 /* release any previous cache */ 300 /* release any previous cache */
295 if (attach->dma_dir != DMA_NONE) { 301 if (attach->dma_dir != DMA_NONE) {
296 dma_unmap_sg(db_attach->dev, sgt->sgl, sgt->orig_nents, 302 dma_unmap_sg_attrs(db_attach->dev, sgt->sgl, sgt->orig_nents,
297 attach->dma_dir); 303 attach->dma_dir, DMA_ATTR_SKIP_CPU_SYNC);
298 attach->dma_dir = DMA_NONE; 304 attach->dma_dir = DMA_NONE;
299 } 305 }
300 306
301 /* mapping to the client with new direction */ 307 /*
302 sgt->nents = dma_map_sg(db_attach->dev, sgt->sgl, sgt->orig_nents, 308 * mapping to the client with new direction, no cache sync
303 dma_dir); 309 * required see comment in vb2_dc_dmabuf_ops_detach()
310 */
311 sgt->nents = dma_map_sg_attrs(db_attach->dev, sgt->sgl, sgt->orig_nents,
312 dma_dir, DMA_ATTR_SKIP_CPU_SYNC);
304 if (!sgt->nents) { 313 if (!sgt->nents) {
305 pr_err("failed to map scatterlist\n"); 314 pr_err("failed to map scatterlist\n");
306 mutex_unlock(lock); 315 mutex_unlock(lock);