diff mbox

dmaengine: pxa_dma: fix hotchain corner case

Message ID 1470596509-1726-1-git-send-email-robert.jarzmik@free.fr (mailing list archive)
State New, archived
Headers show

Commit Message

Robert Jarzmik Aug. 7, 2016, 7:01 p.m. UTC
In the case where a descriptor is chained on a running channel, and as
explained in the comment in the code 10 lines above, the success of the
chaining is ensured either if :
 - the DMA is still running
 - or if the chained transfer is completed

Unfortunately the transfer completness test was done on the descriptor
to which the transfer was chained, and not the transfer being chained at
the end, ie. hot-chained.

This corner case is extremely hard to trigger, as usually the DMA chain
is still running, and the first case takes care of returning success of
the hot-chaining. It was seen by hot-chaining several "small transfers"
to a running "big transfer", not in a real-life usecase but by testing
the robustness of the driver.

Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
---
 drivers/dma/pxa_dma.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Vinod Koul Aug. 19, 2016, 6:32 a.m. UTC | #1
On Sun, Aug 07, 2016 at 09:01:48PM +0200, Robert Jarzmik wrote:
> In the case where a descriptor is chained on a running channel, and as
> explained in the comment in the code 10 lines above, the success of the
> chaining is ensured either if :
>  - the DMA is still running
>  - or if the chained transfer is completed
> 
> Unfortunately the transfer completness test was done on the descriptor
> to which the transfer was chained, and not the transfer being chained at
> the end, ie. hot-chained.
> 
> This corner case is extremely hard to trigger, as usually the DMA chain
> is still running, and the first case takes care of returning success of
> the hot-chaining. It was seen by hot-chaining several "small transfers"
> to a running "big transfer", not in a real-life usecase but by testing
> the robustness of the driver.

Applied, thanks
diff mbox

Patch

diff --git a/drivers/dma/pxa_dma.c b/drivers/dma/pxa_dma.c
index e756a30ccba2..64758daa9eee 100644
--- a/drivers/dma/pxa_dma.c
+++ b/drivers/dma/pxa_dma.c
@@ -635,7 +635,7 @@  static bool pxad_try_hotchain(struct virt_dma_chan *vc,
 		vd_last_issued = list_entry(vc->desc_issued.prev,
 					    struct virt_dma_desc, node);
 		pxad_desc_chain(vd_last_issued, vd);
-		if (is_chan_running(chan) || is_desc_completed(vd_last_issued))
+		if (is_chan_running(chan) || is_desc_completed(vd))
 			return true;
 	}