diff mbox

[v2] dma: rcar-dmac: use list_add() on rcar_dmac_desc_put()

Message ID 877fecbcxh.wl%kuninori.morimoto.gx@renesas.com (mailing list archive)
State Accepted
Headers show

Commit Message

Kuninori Morimoto May 30, 2016, 12:41 a.m. UTC
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

For each descriptor, in addition to the memory used by the descriptors
structure itself, the driver allocates a list of chunks as well as a
buffer for hardware descriptors. Descriptors themselves are preallocated,
and allocation of the chunks and buffer is performed the first time the
descriptor is used. The memory isn't freed when the transfer is completed,
as the chunks and buffer will be needed again when the descriptor is
reused internally, so the driver keeps the memory around.

If only a few descriptors are used concurrently, the current
list_add_tail() implementation will result in all preallocated descriptors
being used before going back to the first one, and will thus allocate
chunks and a buffer for all preallocated descriptors. Using list_add()
will put the complete descriptor at the head of the list of available
descriptors, so the next transfer will be more likely to reuse a
descriptor that already has associated memory instead of one that has
never been used before.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
v1 -> v2

 - used Laurent's explain on log

 drivers/dma/sh/rcar-dmac.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Vinod Koul May 30, 2016, 3:42 a.m. UTC | #1
On Mon, May 30, 2016 at 12:41:48AM +0000, Kuninori Morimoto wrote:
> 
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> For each descriptor, in addition to the memory used by the descriptors
> structure itself, the driver allocates a list of chunks as well as a
> buffer for hardware descriptors. Descriptors themselves are preallocated,
> and allocation of the chunks and buffer is performed the first time the
> descriptor is used. The memory isn't freed when the transfer is completed,
> as the chunks and buffer will be needed again when the descriptor is
> reused internally, so the driver keeps the memory around.
> 
> If only a few descriptors are used concurrently, the current
> list_add_tail() implementation will result in all preallocated descriptors
> being used before going back to the first one, and will thus allocate
> chunks and a buffer for all preallocated descriptors. Using list_add()
> will put the complete descriptor at the head of the list of available
> descriptors, so the next transfer will be more likely to reuse a
> descriptor that already has associated memory instead of one that has
> never been used before.

Applied after fixing subsystem name
diff mbox

Patch

diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c
index 02b86c6..616c63a 100644
--- a/drivers/dma/sh/rcar-dmac.c
+++ b/drivers/dma/sh/rcar-dmac.c
@@ -519,7 +519,7 @@  static void rcar_dmac_desc_put(struct rcar_dmac_chan *chan,
 
 	spin_lock_irqsave(&chan->lock, flags);
 	list_splice_tail_init(&desc->chunks, &chan->desc.chunks_free);
-	list_add_tail(&desc->node, &chan->desc.free);
+	list_add(&desc->node, &chan->desc.free);
 	spin_unlock_irqrestore(&chan->lock, flags);
 }