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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче