]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ALSA: dmaengine: increment buffer pointer atomically
authorAndreas Pape <apape@de.adit-jv.com>
Mon, 26 Sep 2022 16:58:13 +0000 (18:58 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 24 Oct 2022 07:57:22 +0000 (09:57 +0200)
[ Upstream commit d1c442019594692c64a70a86ad88eb5b6db92216 ]

Setting pointer and afterwards checking for wraparound leads
to the possibility of returning the inconsistent pointer position.

This patch increments buffer pointer atomically to avoid this issue.

Fixes: e7f73a1613567a ("ASoC: Add dmaengine PCM helper functions")
Signed-off-by: Andreas Pape <apape@de.adit-jv.com>
Signed-off-by: Eugeniu Rosca <erosca@de.adit-jv.com>
Link: https://lore.kernel.org/r/1664211493-11789-1-git-send-email-erosca@de.adit-jv.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/core/pcm_dmaengine.c

index af6f717e1e7e66fe060d0b75ab50589cc2e10087..c6ccb75036aecb3c4865a3c727a4064869c6af22 100644 (file)
@@ -131,12 +131,14 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_set_config_from_dai_data);
 
 static void dmaengine_pcm_dma_complete(void *arg)
 {
+       unsigned int new_pos;
        struct snd_pcm_substream *substream = arg;
        struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
 
-       prtd->pos += snd_pcm_lib_period_bytes(substream);
-       if (prtd->pos >= snd_pcm_lib_buffer_bytes(substream))
-               prtd->pos = 0;
+       new_pos = prtd->pos + snd_pcm_lib_period_bytes(substream);
+       if (new_pos >= snd_pcm_lib_buffer_bytes(substream))
+               new_pos = 0;
+       prtd->pos = new_pos;
 
        snd_pcm_period_elapsed(substream);
 }