x86/mce: Set up timer unconditionally
mce_timer must be passed to setup_timer() in all cases, no matter whether it is going to be actually used. Otherwise, when the CPU gets brought down, its call to del_timer_sync() will never return, as the timer won't have a base associated, and hence lock_timer_base() will loop infinitely. Signed-off-by: Jan Beulich <jbeulich@novell.com> Signed-off-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> Cc: <stable@kernel.org> LKML-Reference: <4B1DB831.2030801@jp.fujitsu.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
@@ -1388,13 +1388,14 @@ static void __mcheck_cpu_init_timer(void)
|
|||||||
struct timer_list *t = &__get_cpu_var(mce_timer);
|
struct timer_list *t = &__get_cpu_var(mce_timer);
|
||||||
int *n = &__get_cpu_var(mce_next_interval);
|
int *n = &__get_cpu_var(mce_next_interval);
|
||||||
|
|
||||||
|
setup_timer(t, mce_start_timer, smp_processor_id());
|
||||||
|
|
||||||
if (mce_ignore_ce)
|
if (mce_ignore_ce)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
*n = check_interval * HZ;
|
*n = check_interval * HZ;
|
||||||
if (!*n)
|
if (!*n)
|
||||||
return;
|
return;
|
||||||
setup_timer(t, mce_start_timer, smp_processor_id());
|
|
||||||
t->expires = round_jiffies(jiffies + *n);
|
t->expires = round_jiffies(jiffies + *n);
|
||||||
add_timer_on(t, smp_processor_id());
|
add_timer_on(t, smp_processor_id());
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user