Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae51ce90 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

Merge branch 'perf/core' of...

parents 072b198a 423478cd
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ extern void die(const char *, struct pt_regs *,long);
extern int __must_check __die(const char *, struct pt_regs *, long);
extern void show_registers(struct pt_regs *regs);
extern void show_trace(struct task_struct *t, struct pt_regs *regs,
		       unsigned long *sp, unsigned long bp);
		       unsigned long *sp);
extern void __show_regs(struct pt_regs *regs, int all);
extern void show_regs(struct pt_regs *regs);
extern unsigned long oops_begin(void);
+30 −3
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#define _ASM_X86_STACKTRACE_H

#include <linux/uaccess.h>
#include <linux/ptrace.h>

extern int kstack_depth_to_print;

@@ -46,7 +47,7 @@ struct stacktrace_ops {
};

void dump_trace(struct task_struct *tsk, struct pt_regs *regs,
		unsigned long *stack, unsigned long bp,
		unsigned long *stack,
		const struct stacktrace_ops *ops, void *data);

#ifdef CONFIG_X86_32
@@ -57,13 +58,39 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs,
#define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :)
#endif

#ifdef CONFIG_FRAME_POINTER
static inline unsigned long
stack_frame(struct task_struct *task, struct pt_regs *regs)
{
	unsigned long bp;

	if (regs)
		return regs->bp;

	if (task == current) {
		/* Grab bp right from our regs */
		get_bp(bp);
		return bp;
	}

	/* bp is the last reg pushed by switch_to */
	return *(unsigned long *)task->thread.sp;
}
#else
static inline unsigned long
stack_frame(struct task_struct *task, struct pt_regs *regs)
{
	return 0;
}
#endif

extern 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);

extern 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);

extern unsigned int code_bytes;

+1 −1
Original line number Diff line number Diff line
@@ -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
+6 −6
Original line number Diff line number Diff line
@@ -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);

+7 −18
Original line number Diff line number Diff line
@@ -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, &regs->sp,
				0, KERN_EMERG);
		show_stack_log_lvl(NULL, regs, &regs->sp, KERN_EMERG);

		printk(KERN_EMERG "Code: ");

Loading