--- x/sound/core/timer.c +++ y/sound/core/timer.c @@ -916,7 +916,14 @@ void snd_timer_interrupt(struct snd_time } /* now process all fast callbacks */ - snd_timer_process_callbacks(timer, &timer->ack_list_head); + if (write_trylock(&tasklist_lock)) { + write_unlock(&tasklist_lock); + snd_timer_process_callbacks(timer, &timer->ack_list_head); + } else { + /* go the slow path to avoid deadlock by calling kill_fasync() */ + list_splice_init(&timer->ack_list_head, + &timer->sack_list_head); + } /* do we have any slow callbacks? */ use_work = !list_empty(&timer->sack_list_head);