mirror of
https://github.com/torvalds/linux.git
synced 2026-06-06 21:45:45 +02:00
ALSA: dmaengine: increment buffer pointer atomically
[ Upstream commitd1c4420195] 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:
parent
4993c1511d
commit
c940636d9c
|
|
@ -130,12 +130,14 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_set_config_from_dai_data);
|
||||||
|
|
||||||
static void dmaengine_pcm_dma_complete(void *arg)
|
static void dmaengine_pcm_dma_complete(void *arg)
|
||||||
{
|
{
|
||||||
|
unsigned int new_pos;
|
||||||
struct snd_pcm_substream *substream = arg;
|
struct snd_pcm_substream *substream = arg;
|
||||||
struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
|
struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
|
||||||
|
|
||||||
prtd->pos += snd_pcm_lib_period_bytes(substream);
|
new_pos = prtd->pos + snd_pcm_lib_period_bytes(substream);
|
||||||
if (prtd->pos >= snd_pcm_lib_buffer_bytes(substream))
|
if (new_pos >= snd_pcm_lib_buffer_bytes(substream))
|
||||||
prtd->pos = 0;
|
new_pos = 0;
|
||||||
|
prtd->pos = new_pos;
|
||||||
|
|
||||||
snd_pcm_period_elapsed(substream);
|
snd_pcm_period_elapsed(substream);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user