On Wed, 6 Jun 2012, Chen Gong wrote: > 于 2012/6/6 18:23, Thomas Gleixner 写道: > I think you mean > > - del_timer_sync(t); > smp_call_function_single(cpu, mce_disable_cpu, &action, 1); > + del_timer_sync(t); > break; No I meant it the way I wrote, but as you don't execute hotplug it's irrelevant. So the obvious candidate is the mce-injection code, which was obviously never tested with DEBUG_PREEMPT enabled. raise_local() can be called with preemption enabled from raise_mce(). Fix for that below. Though I can't see how that would do anything with the timer. Another thing in that mce injection code is that there is no protection against concurrent writes, except when the device was opened with O_EXCL, but what guarantees that ? Thanks, tglx Index: tip/arch/x86/kernel/cpu/mcheck/mce-inject.c =================================================================== --- tip.orig/arch/x86/kernel/cpu/mcheck/mce-inject.c +++ tip/arch/x86/kernel/cpu/mcheck/mce-inject.c @@ -194,7 +194,11 @@ static void raise_mce(struct mce *m) put_online_cpus(); } else #endif + { + preempt_disable(); raise_local(); + preempt_enable(); + } } /* Error injection interface */