Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48675044 authored by Hyesoo Yu's avatar Hyesoo Yu Committed by Hridya Valsaraju
Browse files

ANDROID: staging: ion: optimize cache operation for non-cached buffer



The non-cached ion buffer is flushed when allocated.
And then, that is is always mapped as non-cached after allocation.
In the absence of caching, cache maintenance operations
become unnecessary. However dma_buf_ops tries to maintain
cache coherency for non-cached buffer on begin[end]_cpu_access
and map[unmap]_dma_buf functions.

It creates unnecessary overhead, so let's remove it.

Bug: 151775080

Signed-off-by: default avatarHyesoo Yu <hyesoo.yu@samsung.com>
Change-Id: I168117c7002aec7930c84168d15816a09750b7d8
Signed-off-by: default avatarHridya Valsaraju <hridya@google.com>
(cherry picked from commit 2c3b4cba8ab38d7eb9f474c78f9b4c70867bf71d)
Signed-off-by: default avatarHridya Valsaraju <hridya@google.com>
parent 8d814964
Loading
Loading
Loading
Loading
+18 −2
Original line number Diff line number Diff line
@@ -105,6 +105,7 @@ static struct sg_table *ion_map_dma_buf(struct dma_buf_attachment *attachment,
	struct ion_heap *heap = buffer->heap;
	struct ion_dma_buf_attachment *a;
	struct sg_table *table;
	unsigned long attrs = attachment->dma_map_attrs;

	if (heap->buf_ops.map_dma_buf)
		return heap->buf_ops.map_dma_buf(attachment, direction);
@@ -112,8 +113,11 @@ static struct sg_table *ion_map_dma_buf(struct dma_buf_attachment *attachment,
	a = attachment->priv;
	table = a->table;

	if (!(buffer->flags & ION_FLAG_CACHED))
		attrs |= DMA_ATTR_SKIP_CPU_SYNC;

	if (!dma_map_sg_attrs(attachment->dev, table->sgl, table->nents,
			      direction, attachment->dma_map_attrs))
			      direction, attrs))
		return ERR_PTR(-ENOMEM);

	a->mapped = true;
@@ -128,6 +132,7 @@ static void ion_unmap_dma_buf(struct dma_buf_attachment *attachment,
	struct ion_buffer *buffer = attachment->dmabuf->priv;
	struct ion_heap *heap = buffer->heap;
	struct ion_dma_buf_attachment *a = attachment->priv;
	unsigned long attrs = attachment->dma_map_attrs;

	a->mapped = false;

@@ -135,8 +140,11 @@ static void ion_unmap_dma_buf(struct dma_buf_attachment *attachment,
		return heap->buf_ops.unmap_dma_buf(attachment, table,
						   direction);

	if (!(buffer->flags & ION_FLAG_CACHED))
		attrs |= DMA_ATTR_SKIP_CPU_SYNC;

	dma_unmap_sg_attrs(attachment->dev, table->sgl, table->nents,
			   direction, attachment->dma_map_attrs);
			   direction, attrs);
}

static void ion_dma_buf_release(struct dma_buf *dmabuf)
@@ -174,6 +182,9 @@ static int ion_dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
		goto unlock;
	}

	if (!(buffer->flags & ION_FLAG_CACHED))
		goto unlock;

	list_for_each_entry(a, &buffer->attachments, list) {
		if (!a->mapped)
			continue;
@@ -218,12 +229,17 @@ static int ion_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
	mutex_lock(&buffer->lock);

	ion_buffer_kmap_put(buffer);

	if (!(buffer->flags & ION_FLAG_CACHED))
		goto unlock;

	list_for_each_entry(a, &buffer->attachments, list) {
		if (!a->mapped)
			continue;
		dma_sync_sg_for_device(a->dev, a->table->sgl, a->table->nents,
				       direction);
	}
unlock:
	mutex_unlock(&buffer->lock);

	return 0;