Skip to content

Commit

Permalink
ALSA: pcm: fix lost wakeup event scenarios in snd_pcm_drain
Browse files Browse the repository at this point in the history
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: f2b3614 ("ALSA: PCM - Don't check DMA time-out too shortly")
Signed-off-by: Yuki Tsunashima <[email protected]>
Signed-off-by: Suresh Udipi <[email protected]>
[ported from 4.9]
Signed-off-by: Adam Miartus <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
ytsunashima authored and tiwai committed Jul 29, 2019
1 parent 74bf71e commit 37151a4
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion sound/core/pcm_native.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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);
Expand Down

0 comments on commit 37151a4

Please sign in to comment.