Merge branch 'perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing into perf/core
This commit is contained in:
@@ -1657,7 +1657,7 @@ perf_callchain_kernel(struct perf_callchain_entry *entry, struct pt_regs *regs)
|
||||
|
||||
perf_callchain_store(entry, regs->ip);
|
||||
|
||||
dump_trace(NULL, regs, NULL, regs->bp, &backtrace_ops, entry);
|
||||
dump_trace(NULL, regs, NULL, &backtrace_ops, entry);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
@@ -175,21 +175,21 @@ static const struct stacktrace_ops print_trace_ops = {
|
||||
|
||||
void
|
||||
show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
||||
unsigned long *stack, unsigned long bp, char *log_lvl)
|
||||
unsigned long *stack, char *log_lvl)
|
||||
{
|
||||
printk("%sCall Trace:\n", log_lvl);
|
||||
dump_trace(task, regs, stack, bp, &print_trace_ops, log_lvl);
|
||||
dump_trace(task, regs, stack, &print_trace_ops, log_lvl);
|
||||
}
|
||||
|
||||
void show_trace(struct task_struct *task, struct pt_regs *regs,
|
||||
unsigned long *stack, unsigned long bp)
|
||||
unsigned long *stack)
|
||||
{
|
||||
show_trace_log_lvl(task, regs, stack, bp, "");
|
||||
show_trace_log_lvl(task, regs, stack, "");
|
||||
}
|
||||
|
||||
void show_stack(struct task_struct *task, unsigned long *sp)
|
||||
{
|
||||
show_stack_log_lvl(task, NULL, sp, 0, "");
|
||||
show_stack_log_lvl(task, NULL, sp, "");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -210,7 +210,7 @@ void dump_stack(void)
|
||||
init_utsname()->release,
|
||||
(int)strcspn(init_utsname()->version, " "),
|
||||
init_utsname()->version);
|
||||
show_trace(NULL, NULL, &stack, bp);
|
||||
show_trace(NULL, NULL, &stack);
|
||||
}
|
||||
EXPORT_SYMBOL(dump_stack);
|
||||
|
||||
|
@@ -17,11 +17,12 @@
|
||||
#include <asm/stacktrace.h>
|
||||
|
||||
|
||||
void dump_trace(struct task_struct *task, struct pt_regs *regs,
|
||||
unsigned long *stack, unsigned long bp,
|
||||
void dump_trace(struct task_struct *task,
|
||||
struct pt_regs *regs, unsigned long *stack,
|
||||
const struct stacktrace_ops *ops, void *data)
|
||||
{
|
||||
int graph = 0;
|
||||
unsigned long bp;
|
||||
|
||||
if (!task)
|
||||
task = current;
|
||||
@@ -34,18 +35,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
|
||||
stack = (unsigned long *)task->thread.sp;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FRAME_POINTER
|
||||
if (!bp) {
|
||||
if (task == current) {
|
||||
/* Grab bp right from our regs */
|
||||
get_bp(bp);
|
||||
} else {
|
||||
/* bp is the last reg pushed by switch_to */
|
||||
bp = *(unsigned long *) task->thread.sp;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
bp = stack_frame(task, regs);
|
||||
for (;;) {
|
||||
struct thread_info *context;
|
||||
|
||||
@@ -65,7 +55,7 @@ EXPORT_SYMBOL(dump_trace);
|
||||
|
||||
void
|
||||
show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
||||
unsigned long *sp, unsigned long bp, char *log_lvl)
|
||||
unsigned long *sp, char *log_lvl)
|
||||
{
|
||||
unsigned long *stack;
|
||||
int i;
|
||||
@@ -87,7 +77,7 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
||||
touch_nmi_watchdog();
|
||||
}
|
||||
printk(KERN_CONT "\n");
|
||||
show_trace_log_lvl(task, regs, sp, bp, log_lvl);
|
||||
show_trace_log_lvl(task, regs, sp, log_lvl);
|
||||
}
|
||||
|
||||
|
||||
@@ -112,8 +102,7 @@ void show_registers(struct pt_regs *regs)
|
||||
u8 *ip;
|
||||
|
||||
printk(KERN_EMERG "Stack:\n");
|
||||
show_stack_log_lvl(NULL, regs, ®s->sp,
|
||||
0, KERN_EMERG);
|
||||
show_stack_log_lvl(NULL, regs, ®s->sp, KERN_EMERG);
|
||||
|
||||
printk(KERN_EMERG "Code: ");
|
||||
|
||||
|
@@ -139,8 +139,8 @@ fixup_bp_irq_link(unsigned long bp, unsigned long *stack,
|
||||
* severe exception (double fault, nmi, stack fault, debug, mce) hardware stack
|
||||
*/
|
||||
|
||||
void dump_trace(struct task_struct *task, struct pt_regs *regs,
|
||||
unsigned long *stack, unsigned long bp,
|
||||
void dump_trace(struct task_struct *task,
|
||||
struct pt_regs *regs, unsigned long *stack,
|
||||
const struct stacktrace_ops *ops, void *data)
|
||||
{
|
||||
const unsigned cpu = get_cpu();
|
||||
@@ -149,6 +149,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
|
||||
unsigned used = 0;
|
||||
struct thread_info *tinfo;
|
||||
int graph = 0;
|
||||
unsigned long bp;
|
||||
|
||||
if (!task)
|
||||
task = current;
|
||||
@@ -160,18 +161,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
|
||||
stack = (unsigned long *)task->thread.sp;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FRAME_POINTER
|
||||
if (!bp) {
|
||||
if (task == current) {
|
||||
/* Grab bp right from our regs */
|
||||
get_bp(bp);
|
||||
} else {
|
||||
/* bp is the last reg pushed by switch_to */
|
||||
bp = *(unsigned long *) task->thread.sp;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
bp = stack_frame(task, regs);
|
||||
/*
|
||||
* Print function call entries in all stacks, starting at the
|
||||
* current stack address. If the stacks consist of nested
|
||||
@@ -235,7 +225,7 @@ EXPORT_SYMBOL(dump_trace);
|
||||
|
||||
void
|
||||
show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
||||
unsigned long *sp, unsigned long bp, char *log_lvl)
|
||||
unsigned long *sp, char *log_lvl)
|
||||
{
|
||||
unsigned long *irq_stack_end;
|
||||
unsigned long *irq_stack;
|
||||
@@ -279,7 +269,7 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
||||
preempt_enable();
|
||||
|
||||
printk(KERN_CONT "\n");
|
||||
show_trace_log_lvl(task, regs, sp, bp, log_lvl);
|
||||
show_trace_log_lvl(task, regs, sp, log_lvl);
|
||||
}
|
||||
|
||||
void show_registers(struct pt_regs *regs)
|
||||
@@ -308,7 +298,7 @@ void show_registers(struct pt_regs *regs)
|
||||
|
||||
printk(KERN_EMERG "Stack:\n");
|
||||
show_stack_log_lvl(NULL, regs, (unsigned long *)sp,
|
||||
regs->bp, KERN_EMERG);
|
||||
KERN_EMERG);
|
||||
|
||||
printk(KERN_EMERG "Code: ");
|
||||
|
||||
|
@@ -91,8 +91,7 @@ void exit_thread(void)
|
||||
void show_regs(struct pt_regs *regs)
|
||||
{
|
||||
show_registers(regs);
|
||||
show_trace(NULL, regs, (unsigned long *)kernel_stack_pointer(regs),
|
||||
regs->bp);
|
||||
show_trace(NULL, regs, (unsigned long *)kernel_stack_pointer(regs));
|
||||
}
|
||||
|
||||
void show_regs_common(void)
|
||||
|
@@ -73,22 +73,22 @@ static const struct stacktrace_ops save_stack_ops_nosched = {
|
||||
*/
|
||||
void save_stack_trace(struct stack_trace *trace)
|
||||
{
|
||||
dump_trace(current, NULL, NULL, 0, &save_stack_ops, trace);
|
||||
dump_trace(current, NULL, NULL, &save_stack_ops, trace);
|
||||
if (trace->nr_entries < trace->max_entries)
|
||||
trace->entries[trace->nr_entries++] = ULONG_MAX;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(save_stack_trace);
|
||||
|
||||
void save_stack_trace_bp(struct stack_trace *trace, unsigned long bp)
|
||||
void save_stack_trace_regs(struct stack_trace *trace, struct pt_regs *regs)
|
||||
{
|
||||
dump_trace(current, NULL, NULL, bp, &save_stack_ops, trace);
|
||||
dump_trace(current, regs, NULL, &save_stack_ops, trace);
|
||||
if (trace->nr_entries < trace->max_entries)
|
||||
trace->entries[trace->nr_entries++] = ULONG_MAX;
|
||||
}
|
||||
|
||||
void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
|
||||
{
|
||||
dump_trace(tsk, NULL, NULL, 0, &save_stack_ops_nosched, trace);
|
||||
dump_trace(tsk, NULL, NULL, &save_stack_ops_nosched, trace);
|
||||
if (trace->nr_entries < trace->max_entries)
|
||||
trace->entries[trace->nr_entries++] = ULONG_MAX;
|
||||
}
|
||||
|
Reference in New Issue
Block a user