[PATCH 06/28] ALSA: dmaengine: Always terminate DMA when a PCM is closed

From: James Calligeros

Date: Sun Sep 20 2026 - 00:56:58 EST


From: Hector Martin <marcan@xxxxxxxxx>

When a PCM is suspended, we pause the DMA. If the PCM is then closed
while in this state, it does not receive the STOP trigger (as it is not
running). In this case, we fail to properly terminate the DMA, calling
dmaengine_synchronize() nonetheless, which is undefined behavior.

Make sure we always call dmaengine_terminate_async() on PCM close,
regardless of whether it has been called previously or not in the
trigger callbacks.

Fixes: bc0e7345168c ("ALSA: pcm_dmaengine: Properly synchronize DMA on shutdown")
Signed-off-by: Hector Martin <marcan@xxxxxxxxx>
Signed-off-by: James Calligeros <jcalligeros99@xxxxxxxxx>
---
sound/core/pcm_dmaengine.c | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/sound/core/pcm_dmaengine.c b/sound/core/pcm_dmaengine.c
index 1306b04be171..e59b561b849d 100644
--- a/sound/core/pcm_dmaengine.c
+++ b/sound/core/pcm_dmaengine.c
@@ -355,6 +355,11 @@ static void __snd_dmaengine_pcm_close(struct snd_pcm_substream *substream,
if (status == DMA_PAUSED)
dmaengine_terminate_async(prtd->dma_chan);

+ /*
+ * The PCM might have been closed while suspended, which would
+ * skip the STOP trigger. Make sure we terminate.
+ */
+ dmaengine_terminate_async(prtd->dma_chan);
dmaengine_synchronize(prtd->dma_chan);
if (release_channel)
dma_release_channel(prtd->dma_chan);

--
2.55.0