Skip to content
Snippets Groups Projects
Commit d1c44201 authored by Andreas Pape's avatar Andreas Pape Committed by Takashi Iwai
Browse files

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.com


Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 675b7cd1
No related branches found
No related tags found
Loading
......@@ -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);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment