[PATCH] x86-64: dump_trace() atomicity fix
authorAndrew Morton <akpm@osdl.org>
Thu, 7 Dec 2006 01:14:02 +0000 (02:14 +0100)
committerAndi Kleen <andi@basil.nowhere.org>
Thu, 7 Dec 2006 01:14:02 +0000 (02:14 +0100)
Fix

BUG: using smp_processor_id() in preemptible [00000001] code:

in backtracer on preemptible debug kernels.

Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Andi Kleen <ak@suse.de>
arch/x86_64/kernel/traps.c

index eedd4e759c3a77c1fd73ffc28d53b613e0e8c85f..e37b4d77d5a80cf44237b73ccb7379a3d65779a1 100644 (file)
@@ -254,7 +254,7 @@ 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();
+       const unsigned cpu = get_cpu();
        unsigned long *irqstack_end = (unsigned long*)cpu_pda(cpu)->irqstackptr;
        unsigned used = 0;
        struct thread_info *tinfo;
@@ -286,11 +286,11 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs,
                                        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
@@ -385,6 +385,8 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs,
        tinfo = current_thread_info();
        HANDLE_STACK (valid_stack_ptr(tinfo, stack));
 #undef HANDLE_STACK
+out:
+       put_cpu();
 }
 EXPORT_SYMBOL(dump_trace);