]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.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)
committerStefan Bader <stefan.bader@canonical.com>
Thu, 24 Nov 2022 13:24:27 +0000 (14:24 +0100)
BugLink: https://bugs.launchpad.net/bugs/1996825
[ 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>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
sound/core/pcm_dmaengine.c

index 1fc2fa07757445948afc98c7e9a3fee891f0acba..0fe93b423c4edf5372749a62ad81e1005197a5d1 100644 (file)
@@ -132,12 +132,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);
 }