All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] dmaengine: pl330: Acquire dmac's spinlock in pl330_tx_status
@ 2016-08-23  9:16 Hsin-Yu Chao
  2016-08-23 17:08 ` Guenter Roeck
  2016-09-09 11:53 ` Vinod Koul
  0 siblings, 2 replies; 3+ messages in thread
From: Hsin-Yu Chao @ 2016-08-23  9:16 UTC (permalink / raw)
  Cc: smbarber, groeck, Hsin-Yu Chao, Vinod Koul, Dan Williams,
	open list:DMA GENERIC OFFLOAD ENGINE SUBSYSTEM, open list

There is a racing when accessing dmac thread in pl330_tx_status that
the pl330_update is handling active request at the same time and
changing the status of descriptors. This could cause an invalid
transferred count from BUSY descriptor added up to the residual number.
Fix the bug by using the dmac's spinlock in pl330_tx_status to protect
thread resources from changing.
Note that the nested order of holding dmac's and dma_chan's spinlock is
consistent with the rest of the driver: dma_chan first and then dmac,
so it is safe from deadlock scenario.

Signed-off-by: Hsin-Yu Chao <hychao@chromium.org>
---
 drivers/dma/pl330.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c
index 2449cb7..bd6861b 100644
--- a/drivers/dma/pl330.c
+++ b/drivers/dma/pl330.c
@@ -2306,6 +2306,7 @@ pl330_tx_status(struct dma_chan *chan, dma_cookie_t cookie,
 		goto out;
 
 	spin_lock_irqsave(&pch->lock, flags);
+	spin_lock(&pch->thread->dmac->lock);
 
 	if (pch->thread->req_running != -1)
 		running = pch->thread->req[pch->thread->req_running].desc;
@@ -2348,6 +2349,7 @@ pl330_tx_status(struct dma_chan *chan, dma_cookie_t cookie,
 		if (desc->last)
 			residual = 0;
 	}
+	spin_unlock(&pch->thread->dmac->lock);
 	spin_unlock_irqrestore(&pch->lock, flags);
 
 out:
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] dmaengine: pl330: Acquire dmac's spinlock in pl330_tx_status
  2016-08-23  9:16 [PATCH] dmaengine: pl330: Acquire dmac's spinlock in pl330_tx_status Hsin-Yu Chao
@ 2016-08-23 17:08 ` Guenter Roeck
  2016-09-09 11:53 ` Vinod Koul
  1 sibling, 0 replies; 3+ messages in thread
From: Guenter Roeck @ 2016-08-23 17:08 UTC (permalink / raw)
  To: Hsin-Yu Chao
  Cc: smbarber, Guenter Roeck, Vinod Koul, Dan Williams,
	open list:DMA GENERIC OFFLOAD ENGINE SUBSYSTEM, open list

On Tue, Aug 23, 2016 at 2:16 AM, Hsin-Yu Chao <hychao@chromium.org> wrote:
> There is a racing when accessing dmac thread in pl330_tx_status that
> the pl330_update is handling active request at the same time and
> changing the status of descriptors. This could cause an invalid
> transferred count from BUSY descriptor added up to the residual number.
> Fix the bug by using the dmac's spinlock in pl330_tx_status to protect
> thread resources from changing.
> Note that the nested order of holding dmac's and dma_chan's spinlock is
> consistent with the rest of the driver: dma_chan first and then dmac,
> so it is safe from deadlock scenario.
>
> Signed-off-by: Hsin-Yu Chao <hychao@chromium.org>

Reviewed-by: Guenter Roeck <groeck@chromium.org>

> ---
>  drivers/dma/pl330.c | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c
> index 2449cb7..bd6861b 100644
> --- a/drivers/dma/pl330.c
> +++ b/drivers/dma/pl330.c
> @@ -2306,6 +2306,7 @@ pl330_tx_status(struct dma_chan *chan, dma_cookie_t cookie,
>                 goto out;
>
>         spin_lock_irqsave(&pch->lock, flags);
> +       spin_lock(&pch->thread->dmac->lock);
>
>         if (pch->thread->req_running != -1)
>                 running = pch->thread->req[pch->thread->req_running].desc;
> @@ -2348,6 +2349,7 @@ pl330_tx_status(struct dma_chan *chan, dma_cookie_t cookie,
>                 if (desc->last)
>                         residual = 0;
>         }
> +       spin_unlock(&pch->thread->dmac->lock);
>         spin_unlock_irqrestore(&pch->lock, flags);
>
>  out:
> --
> 2.8.0.rc3.226.g39d4020
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] dmaengine: pl330: Acquire dmac's spinlock in pl330_tx_status
  2016-08-23  9:16 [PATCH] dmaengine: pl330: Acquire dmac's spinlock in pl330_tx_status Hsin-Yu Chao
  2016-08-23 17:08 ` Guenter Roeck
@ 2016-09-09 11:53 ` Vinod Koul
  1 sibling, 0 replies; 3+ messages in thread
From: Vinod Koul @ 2016-09-09 11:53 UTC (permalink / raw)
  To: Hsin-Yu Chao
  Cc: smbarber, groeck, Dan Williams,
	open list:DMA GENERIC OFFLOAD ENGINE SUBSYSTEM, open list

On Tue, Aug 23, 2016 at 05:16:55PM +0800, Hsin-Yu Chao wrote:
> There is a racing when accessing dmac thread in pl330_tx_status that
> the pl330_update is handling active request at the same time and
> changing the status of descriptors. This could cause an invalid
> transferred count from BUSY descriptor added up to the residual number.
> Fix the bug by using the dmac's spinlock in pl330_tx_status to protect
> thread resources from changing.
> Note that the nested order of holding dmac's and dma_chan's spinlock is
> consistent with the rest of the driver: dma_chan first and then dmac,
> so it is safe from deadlock scenario.

Applied, thanks

-- 
~Vinod

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-09-09 11:44 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-08-23  9:16 [PATCH] dmaengine: pl330: Acquire dmac's spinlock in pl330_tx_status Hsin-Yu Chao
2016-08-23 17:08 ` Guenter Roeck
2016-09-09 11:53 ` Vinod Koul

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.