[PATCH 3.12 66/78] ALSA: timer: Sync timer deletion at closing the system timer

From: Jiri Slaby
Date: Fri Apr 22 2016 - 07:11:42 EST


From: Takashi Iwai <tiwai@xxxxxxx>

3.12-stable review patch. If anyone has any objections, please let me know.

===============

commit f146357f069e71aff8e474c625bcebcd3094b3ab upstream.

ALSA timer core framework has no sync point at stopping because it's
called inside the spinlock. Thus we need a sync point at close for
avoiding the stray timer task. This is simply done by implementing
the close callback just calling del_timer_sync(). (It's harmless to
call it unconditionally, as the core timer itself cares of the already
deleted timer instance.)

Signed-off-by: Takashi Iwai <tiwai@xxxxxxx>
Signed-off-by: Jiri Slaby <jslaby@xxxxxxx>
---
sound/core/timer.c | 10 ++++++++++
1 file changed, 10 insertions(+)

diff --git a/sound/core/timer.c b/sound/core/timer.c
index 38742e826900..10463beae4bb 100644
--- a/sound/core/timer.c
+++ b/sound/core/timer.c
@@ -1033,11 +1033,21 @@ static int snd_timer_s_stop(struct snd_timer * timer)
return 0;
}

+static int snd_timer_s_close(struct snd_timer *timer)
+{
+ struct snd_timer_system_private *priv;
+
+ priv = (struct snd_timer_system_private *)timer->private_data;
+ del_timer_sync(&priv->tlist);
+ return 0;
+}
+
static struct snd_timer_hardware snd_timer_system =
{
.flags = SNDRV_TIMER_HW_FIRST | SNDRV_TIMER_HW_TASKLET,
.resolution = 1000000000L / HZ,
.ticks = 10000000L,
+ .close = snd_timer_s_close,
.start = snd_timer_s_start,
.stop = snd_timer_s_stop
};
--
2.8.1