Commit d1c44201 authored by Andreas Pape's avatar Andreas Pape Committed by Takashi Iwai

ALSA: dmaengine: increment buffer pointer atomically

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: e7f73a16 ("ASoC: Add dmaengine PCM helper functions")
Signed-off-by: default avatarAndreas Pape <apape@de.adit-jv.com>
Signed-off-by: default avatarEugeniu Rosca <erosca@de.adit-jv.com>
Link: https://lore.kernel.org/r/1664211493-11789-1-git-send-email-erosca@de.adit-jv.comSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 675b7cd1
......@@ -133,12 +133,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);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment