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: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2016-02-02 14:14:10 +01:00
parent f784beb75c
commit f146357f06
1 changed files with 10 additions and 0 deletions

View File

@ -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
}; };