diff mbox series

[v2] dmaengine: ptdma: check for null desc before calling pt_cmd_callback

Message ID 20230210075142.58253-1-epilmore@gigaio.com (mailing list archive)
State Accepted
Commit 0a60cc31858f289b8592c029a3bc109ff956f086
Headers show
Series [v2] dmaengine: ptdma: check for null desc before calling pt_cmd_callback | expand

Commit Message

Eric Pilmore Feb. 10, 2023, 7:51 a.m. UTC
Resolves a panic that can occur on AMD systems, typically during host
shutdown, after the PTDMA driver had been exercised. The issue was
the pt_issue_pending() function is mistakenly assuming that there will
be at least one descriptor in the Submitted queue when the function
is called. However, it is possible that both the Submitted and Issued
queues could be empty, which could result in pt_cmd_callback() being
mistakenly called with a NULL pointer.
Ref: Bugzilla Bug 216856.

Fixes: 6fa7e0e836e2 ("dmaengine: ptdma: fix concurrency issue with multiple dma transfer")
Signed-off-by: Eric Pilmore <epilmore@gigaio.com>
---
v2: clean-up patch format

 drivers/dma/ptdma/ptdma-dmaengine.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Vinod Koul Feb. 10, 2023, 8:57 a.m. UTC | #1
On 09-02-23, 23:51, Eric Pilmore wrote:
> Resolves a panic that can occur on AMD systems, typically during host
> shutdown, after the PTDMA driver had been exercised. The issue was
> the pt_issue_pending() function is mistakenly assuming that there will
> be at least one descriptor in the Submitted queue when the function
> is called. However, it is possible that both the Submitted and Issued
> queues could be empty, which could result in pt_cmd_callback() being
> mistakenly called with a NULL pointer.
> Ref: Bugzilla Bug 216856.

Applied, thanks
diff mbox series

Patch

diff --git a/drivers/dma/ptdma/ptdma-dmaengine.c b/drivers/dma/ptdma/ptdma-dmaengine.c
index cc22d162ce25..1aa65e5de0f3 100644
--- a/drivers/dma/ptdma/ptdma-dmaengine.c
+++ b/drivers/dma/ptdma/ptdma-dmaengine.c
@@ -254,7 +254,7 @@  static void pt_issue_pending(struct dma_chan *dma_chan)
 	spin_unlock_irqrestore(&chan->vc.lock, flags);
 
 	/* If there was nothing active, start processing */
-	if (engine_is_idle)
+	if (engine_is_idle && desc)
 		pt_cmd_callback(desc, 0);
 }