dump_trace() atomicity fix From: Andrew Morton BUG: using smp_processor_id() in preemptible [00000001] code: Cc: Andi Kleen Signed-off-by: Andrew Morton Signed-off-by: Andi Kleen --- arch/x86_64/kernel/traps.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) Index: linux/arch/x86_64/kernel/traps.c =================================================================== --- linux.orig/arch/x86_64/kernel/traps.c +++ linux/arch/x86_64/kernel/traps.c @@ -248,10 +248,12 @@ void dump_trace(struct task_struct *tsk, unsigned long *stack, struct stacktrace_ops *ops, void *data) { - const unsigned cpu = smp_processor_id(); + unsigned cpu = get_cpu(); unsigned long *irqstack_end = (unsigned long*)cpu_pda(cpu)->irqstackptr; unsigned used = 0; + irqstack_end = (unsigned long*)cpu_pda(cpu)->irqstackptr; + if (!tsk) tsk = current; @@ -279,11 +281,11 @@ void dump_trace(struct task_struct *tsk, MSG("Leftover inexact backtrace:"); stack = (unsigned long *)UNW_SP(&info); if (!stack) - return; + goto out; } else MSG("Full inexact backtrace again:"); } else if (call_trace >= 1) - return; + goto out; else MSG("Full inexact backtrace again:"); } else @@ -371,6 +373,8 @@ void dump_trace(struct task_struct *tsk, */ HANDLE_STACK (((long) stack & (THREAD_SIZE-1)) != 0); #undef HANDLE_STACK +out: + put_cpu(); } EXPORT_SYMBOL(dump_trace);