[PATCH] x86-64: dump_trace() atomicity fix
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>
This commit is contained in:
parent
bb0d977ed4
commit
da68933e0a
1 changed files with 5 additions and 3 deletions
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue