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:
Родитель
f5f1f5ee50
Коммит
b14dc26227
|
@ -132,12 +132,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);
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче