Skip to content

Commit 12a1a28

Browse files
marcanjannau
authored andcommitted
ALSA: dmaengine: Always terminate DMA when a PCM is closed
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. Signed-off-by: Hector Martin <marcan@marcan.st>
1 parent 05591c8 commit 12a1a28

1 file changed

Lines changed: 5 additions & 0 deletions

File tree

sound/core/pcm_dmaengine.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,11 @@ int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream)
375375
if (status == DMA_PAUSED)
376376
dmaengine_terminate_async(prtd->dma_chan);
377377

378+
/*
379+
* The PCM might have been closed while suspended, which would
380+
* skip the STOP trigger. Make sure we terminate.
381+
*/
382+
dmaengine_terminate_async(prtd->dma_chan);
378383
dmaengine_synchronize(prtd->dma_chan);
379384
kfree(prtd);
380385

0 commit comments

Comments
 (0)