Skip to content

Commit 445a093

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 d2e7faf commit 445a093

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
@@ -374,6 +374,11 @@ static void __snd_dmaengine_pcm_close(struct snd_pcm_substream *substream,
374374
if (status == DMA_PAUSED)
375375
dmaengine_terminate_async(prtd->dma_chan);
376376

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

0 commit comments

Comments
 (0)