Commit f146357f authored by Takashi Iwai's avatar Takashi Iwai

ALSA: timer: Sync timer deletion at closing the system timer

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: default avatarTakashi Iwai <tiwai@suse.de>
parent f784beb7
...@@ -1058,11 +1058,21 @@ static int snd_timer_s_stop(struct snd_timer * timer) ...@@ -1058,11 +1058,21 @@ static int snd_timer_s_stop(struct snd_timer * timer)
return 0; 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 = static struct snd_timer_hardware snd_timer_system =
{ {
.flags = SNDRV_TIMER_HW_FIRST | SNDRV_TIMER_HW_TASKLET, .flags = SNDRV_TIMER_HW_FIRST | SNDRV_TIMER_HW_TASKLET,
.resolution = 1000000000L / HZ, .resolution = 1000000000L / HZ,
.ticks = 10000000L, .ticks = 10000000L,
.close = snd_timer_s_close,
.start = snd_timer_s_start, .start = snd_timer_s_start,
.stop = snd_timer_s_stop .stop = snd_timer_s_stop
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment