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

Commit eca9dfcd authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'perf-fixes-for-linus' of...

Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  perf session: Make events_stats u64 to avoid overflow on 32-bit arches
  hw-breakpoints: Fix hardware breakpoints -> perf events dependency
  perf events: Dont report side-band events on each cpu for per-task-per-cpu events
  perf events, x86/stacktrace: Fix performance/softlockup by providing a special frame pointer-only stack walker
  perf events, x86/stacktrace: Make stack walking optional
  perf events: Remove unused perf_counter.h header file
  perf probe: Check new event name
  kprobe-tracer: Check new event/group name
  perf probe: Check whether debugfs path is correct
  perf probe: Fix libdwarf include path for Debian
parents 3981e152 b5b60fda
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -135,9 +135,7 @@ config HAVE_DEFAULT_NO_SPIN_MUTEXES

config HAVE_HW_BREAKPOINT
	bool
	depends on HAVE_PERF_EVENTS
	select ANON_INODES
	select PERF_EVENTS
	depends on PERF_EVENTS

config HAVE_USER_RETURN_NOTIFIER
	bool
+2 −0
Original line number Diff line number Diff line
@@ -50,6 +50,8 @@ config X86
	select HAVE_KERNEL_BZIP2
	select HAVE_KERNEL_LZMA
	select HAVE_HW_BREAKPOINT
	select PERF_EVENTS
	select ANON_INODES
	select HAVE_ARCH_KMEMCHECK
	select HAVE_USER_RETURN_NOTIFIER

+24 −0
Original line number Diff line number Diff line
@@ -5,6 +5,29 @@ extern int kstack_depth_to_print;

int x86_is_stack_id(int id, char *name);

struct thread_info;
struct stacktrace_ops;

typedef unsigned long (*walk_stack_t)(struct thread_info *tinfo,
				      unsigned long *stack,
				      unsigned long bp,
				      const struct stacktrace_ops *ops,
				      void *data,
				      unsigned long *end,
				      int *graph);

extern unsigned long
print_context_stack(struct thread_info *tinfo,
		    unsigned long *stack, unsigned long bp,
		    const struct stacktrace_ops *ops, void *data,
		    unsigned long *end, int *graph);

extern unsigned long
print_context_stack_bp(struct thread_info *tinfo,
		       unsigned long *stack, unsigned long bp,
		       const struct stacktrace_ops *ops, void *data,
		       unsigned long *end, int *graph);

/* Generic stack tracer with callbacks */

struct stacktrace_ops {
@@ -14,6 +37,7 @@ struct stacktrace_ops {
	void (*address)(void *data, unsigned long address, int reliable);
	/* On negative return stop dumping */
	int (*stack)(void *data, char *name);
	walk_stack_t	walk_stack;
};

void dump_trace(struct task_struct *tsk, struct pt_regs *regs,
+1 −0
Original line number Diff line number Diff line
@@ -2336,6 +2336,7 @@ static const struct stacktrace_ops backtrace_ops = {
	.warning_symbol		= backtrace_warning_symbol,
	.stack			= backtrace_stack,
	.address		= backtrace_address,
	.walk_stack		= print_context_stack_bp,
};

#include "../dumpstack.h"
+29 −4
Original line number Diff line number Diff line
@@ -109,6 +109,30 @@ print_context_stack(struct thread_info *tinfo,
	}
	return bp;
}
EXPORT_SYMBOL_GPL(print_context_stack);

unsigned long
print_context_stack_bp(struct thread_info *tinfo,
		       unsigned long *stack, unsigned long bp,
		       const struct stacktrace_ops *ops, void *data,
		       unsigned long *end, int *graph)
{
	struct stack_frame *frame = (struct stack_frame *)bp;
	unsigned long *ret_addr = &frame->return_address;

	while (valid_stack_ptr(tinfo, ret_addr, sizeof(*ret_addr), end)) {
		unsigned long addr = *ret_addr;

		if (__kernel_text_address(addr)) {
			ops->address(data, addr, 1);
			frame = frame->next_frame;
			ret_addr = &frame->return_address;
			print_ftrace_graph_addr(addr, data, ops, tinfo, graph);
		}
	}
	return (unsigned long)frame;
}
EXPORT_SYMBOL_GPL(print_context_stack_bp);


static void
@@ -145,6 +169,7 @@ static const struct stacktrace_ops print_trace_ops = {
	.warning_symbol		= print_trace_warning_symbol,
	.stack			= print_trace_stack,
	.address		= print_trace_address,
	.walk_stack		= print_context_stack,
};

void
Loading