Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 37151a41 authored by Yuki Tsunashima's avatar Yuki Tsunashima Committed by Takashi Iwai
Browse files

ALSA: pcm: fix lost wakeup event scenarios in snd_pcm_drain



lost wakeup can occur after enabling irq, therefore put task
into interruptible before enabling interrupts,

without this change, task can be put to sleep and snd_pcm_drain
will delay

Fixes: f2b3614c ("ALSA: PCM - Don't check DMA time-out too shortly")
Signed-off-by: default avatarYuki Tsunashima <ytsunashima@jp.adit-jv.com>
Signed-off-by: default avatarSuresh Udipi <sudipi@jp.adit-jv.com>
[ported from 4.9]
Signed-off-by: default avatarAdam Miartus <amiartus@de.adit-jv.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 74bf71ed
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1873,6 +1873,7 @@ static int snd_pcm_drain(struct snd_pcm_substream *substream,
		if (!to_check)
			break; /* all drained */
		init_waitqueue_entry(&wait, current);
		set_current_state(TASK_INTERRUPTIBLE);
		add_wait_queue(&to_check->sleep, &wait);
		snd_pcm_stream_unlock_irq(substream);
		if (runtime->no_period_wakeup)
@@ -1885,7 +1886,7 @@ static int snd_pcm_drain(struct snd_pcm_substream *substream,
			}
			tout = msecs_to_jiffies(tout * 1000);
		}
		tout = schedule_timeout_interruptible(tout);
		tout = schedule_timeout(tout);

		snd_pcm_stream_lock_irq(substream);
		group = snd_pcm_stream_group_ref(substream);