Skip to content

Commit 0ddfab9

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 d2b282c commit 0ddfab9

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
@@ -359,6 +359,11 @@ int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream)
359359
{
360360
struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
361361

362+
/*
363+
* The PCM might have been closed while suspended, which would
364+
* skip the STOP trigger. Make sure we terminate.
365+
*/
366+
dmaengine_terminate_async(prtd->dma_chan);
362367
dmaengine_synchronize(prtd->dma_chan);
363368
kfree(prtd);
364369

0 commit comments

Comments
 (0)