diff options
author | Takashi Iwai <tiwai@suse.de> | 2016-02-02 14:14:10 +0100 |
---|---|---|
committer | Jiri Slaby <jslaby@suse.cz> | 2016-04-21 13:11:54 +0200 |
commit | 9a2fa0d4c5b6427c76b6d6cb8587c2080a2add93 (patch) | |
tree | c56fb919ac4790e8434fd61bdd9393f34909af8c /sound | |
parent | 6f6abe510fc7cb0f6933c1b99ab059b1899e9cdb (diff) |
ALSA: timer: Sync timer deletion at closing the system timer
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@suse.de>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/core/timer.c | 10 |
1 files changed, 10 insertions, 0 deletions
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 }; |