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 Original line 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 int __must_check __die(const char *, struct pt_regs *, long);
extern void show_registers(struct pt_regs *regs);
extern void show_registers(struct pt_regs *regs);
extern void show_trace(struct task_struct *t, 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, int all);
extern void show_regs(struct pt_regs *regs);
extern void show_regs(struct pt_regs *regs);
extern unsigned long oops_begin(void);
extern unsigned long oops_begin(void);
+30 −3
Original line number Original line Diff line number Diff line
@@ -7,6 +7,7 @@
#define _ASM_X86_STACKTRACE_H
#define _ASM_X86_STACKTRACE_H


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


extern int kstack_depth_to_print;
extern int kstack_depth_to_print;


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


void dump_trace(struct task_struct *tsk, struct pt_regs *regs,
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);
		const struct stacktrace_ops *ops, void *data);


#ifdef CONFIG_X86_32
#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) :)
#define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :)
#endif
#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
extern void
show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
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
extern void
show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
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;
extern unsigned int code_bytes;


+1 −1
Original line number Original line 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);
	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
#ifdef CONFIG_COMPAT
+6 −6
Original line number Original line Diff line number Diff line
@@ -175,21 +175,21 @@ static const struct stacktrace_ops print_trace_ops = {


void
void
show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
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);
	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,
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)
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,
		init_utsname()->release,
		(int)strcspn(init_utsname()->version, " "),
		(int)strcspn(init_utsname()->version, " "),
		init_utsname()->version);
		init_utsname()->version);
	show_trace(NULL, NULL, &stack, bp);
	show_trace(NULL, NULL, &stack);
}
}
EXPORT_SYMBOL(dump_stack);
EXPORT_SYMBOL(dump_stack);


+7 −18
Original line number Original line Diff line number Diff line
@@ -17,11 +17,12 @@
#include <asm/stacktrace.h>
#include <asm/stacktrace.h>




void dump_trace(struct task_struct *task, struct pt_regs *regs,
void dump_trace(struct task_struct *task,
		unsigned long *stack, unsigned long bp,
		struct pt_regs *regs, unsigned long *stack,
		const struct stacktrace_ops *ops, void *data)
		const struct stacktrace_ops *ops, void *data)
{
{
	int graph = 0;
	int graph = 0;
	unsigned long bp;


	if (!task)
	if (!task)
		task = current;
		task = current;
@@ -34,18 +35,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
			stack = (unsigned long *)task->thread.sp;
			stack = (unsigned long *)task->thread.sp;
	}
	}


#ifdef CONFIG_FRAME_POINTER
	bp = stack_frame(task, regs);
	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

	for (;;) {
	for (;;) {
		struct thread_info *context;
		struct thread_info *context;


@@ -65,7 +55,7 @@ EXPORT_SYMBOL(dump_trace);


void
void
show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
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;
	unsigned long *stack;
	int i;
	int i;
@@ -87,7 +77,7 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
		touch_nmi_watchdog();
		touch_nmi_watchdog();
	}
	}
	printk(KERN_CONT "\n");
	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;
		u8 *ip;


		printk(KERN_EMERG "Stack:\n");
		printk(KERN_EMERG "Stack:\n");
		show_stack_log_lvl(NULL, regs, &regs->sp,
		show_stack_log_lvl(NULL, regs, &regs->sp, KERN_EMERG);
				0, KERN_EMERG);


		printk(KERN_EMERG "Code: ");
		printk(KERN_EMERG "Code: ");


Loading