ALSA: dmaengine: increment buffer pointer atomically
[ 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>
This commit is contained in:
parent
f5f1f5ee50
commit
b14dc26227
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user