From: Andrew Morton BUG: using smp_processor_id() in preemptible [00000001] code: Cc: Andi Kleen Signed-off-by: Andrew Morton --- arch/x86_64/kernel/traps.c | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) diff -puN arch/x86_64/kernel/traps.c~x86_64-dump_trace-atomicity-fix arch/x86_64/kernel/traps.c --- a/arch/x86_64/kernel/traps.c~x86_64-dump_trace-atomicity-fix +++ a/arch/x86_64/kernel/traps.c @@ -245,10 +245,14 @@ static int dump_trace_unwind(struct unwi void dump_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * stack, struct stacktrace_ops *ops, void *data) { - const unsigned cpu = smp_processor_id(); - unsigned long *irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr; + unsigned cpu; + unsigned long *irqstack_end; unsigned used = 0; + preempt_disable(); + cpu = smp_processor_id(); + irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr; + if (!tsk) tsk = current; @@ -274,11 +278,11 @@ void dump_trace(struct task_struct *tsk, ops->warning(data, "Leftover inexact backtrace:\n"); stack = (unsigned long *)UNW_SP(&info); if (!stack) - return; + goto out; } else ops->warning(data, "Full inexact backtrace again:\n"); } else if (call_trace >= 1) - return; + goto out; else ops->warning(data, "Full inexact backtrace again:\n"); } else @@ -366,6 +370,8 @@ void dump_trace(struct task_struct *tsk, */ HANDLE_STACK (((long) stack & (THREAD_SIZE-1)) != 0); #undef HANDLE_STACK +out: + preempt_enable(); } EXPORT_SYMBOL(dump_trace); _