ALSA: dmaengine: increment buffer pointer atomically

[ Upstream commit d1c4420195 ]

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: e7f73a1613 ("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>
This commit is contained in:
Andreas Pape 2022-09-26 18:58:13 +02:00 committed by Greg Kroah-Hartman
parent ec692f0b51
commit 2e2c57f660
1 changed files with 5 additions and 3 deletions

View 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);
}