Cc: Oleg Nesterov Signed-off-by: Andrew Morton --- kernel/timer.c | 19 +++++++++++-------- 1 files changed, 11 insertions(+), 8 deletions(-) diff -puN kernel/timer.c~timers-fix-__mod_timer-vs-__run_timers-deadlock-tidy kernel/timer.c --- 25/kernel/timer.c~timers-fix-__mod_timer-vs-__run_timers-deadlock-tidy 2005-05-01 02:22:00.502889928 -0700 +++ 25-akpm/kernel/timer.c 2005-05-01 02:26:22.532055440 -0700 @@ -211,14 +211,13 @@ int __mod_timer(struct timer_list *timer timer_base_t *base; tvec_base_t *new_base; unsigned long flags; - int ret; + int ret = 0; BUG_ON(!timer->function); check_timer(timer); base = lock_timer_base(timer, &flags); - ret = 0; if (timer_pending(timer)) { detach_timer(timer, 0); ret = 1; @@ -227,14 +226,18 @@ int __mod_timer(struct timer_list *timer new_base = &__get_cpu_var(tvec_bases); if (base != &new_base->t_base) { - if (unlikely(base->running_timer == timer)) - /* Don't change timer's base while it is running. - * Needed for serialization of timer wrt itself. */ + if (unlikely(base->running_timer == timer)) { + /* + * Don't change timer's base while it is running. + * Needed for serialization of timer wrt itself. + */ new_base = container_of(base, tvec_base_t, t_base); - else { + } else { timer->base = NULL; - /* Safe: the timer can't be seen via ->entry, - * and lock_timer_base checks ->base != 0. */ + /* + * Safe: the timer can't be seen via ->entry and + * lock_timer_base() checks ->base != 0. + */ spin_unlock(&base->lock); spin_lock(&new_base->t_base.lock); timer->base = &new_base->t_base; _