Message ID | 877fecbcxh.wl%kuninori.morimoto.gx@renesas.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
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 --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); }