aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2009-12-05 06:01:17 -0500
committerFrederic Weisbecker <fweisbec@gmail.com>2009-12-06 02:27:21 -0500
commit7f33f9c5cc3c99aeaf4d266a7ed502b828115a53 (patch)
treef37f964798815c3946c7334e598ba3600a0539d0
parentc0dfb2feb632537cf0a9d2ce3c29bcf5778fec59 (diff)
x86/perf: Exclude the debug stack from the callchains
Dumping the callchains from breakpoint events with perf gives strange results: 3.75% perf [kernel] [k] _raw_read_unlock | --- _raw_read_unlock perf_callchain perf_prepare_sample __perf_event_overflow perf_swevent_overflow perf_swevent_add perf_bp_event hw_breakpoint_exceptions_notify notifier_call_chain __atomic_notifier_call_chain atomic_notifier_call_chain notify_die do_debug debug munmap We are infected with all the debug stack. Like the nmi stack, the debug stack is undesired as it is part of the profiling path, not helpful for the user. Ignore it. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: "K. Prasad" <prasad@linux.vnet.ibm.com>
-rw-r--r--arch/x86/kernel/cpu/perf_event.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c
index c1bbed1021d9..d35f26076ae5 100644
--- a/arch/x86/kernel/cpu/perf_event.c
+++ b/arch/x86/kernel/cpu/perf_event.c
@@ -2287,7 +2287,7 @@ void callchain_store(struct perf_callchain_entry *entry, u64 ip)
2287 2287
2288static DEFINE_PER_CPU(struct perf_callchain_entry, pmc_irq_entry); 2288static DEFINE_PER_CPU(struct perf_callchain_entry, pmc_irq_entry);
2289static DEFINE_PER_CPU(struct perf_callchain_entry, pmc_nmi_entry); 2289static DEFINE_PER_CPU(struct perf_callchain_entry, pmc_nmi_entry);
2290static DEFINE_PER_CPU(int, in_nmi_frame); 2290static DEFINE_PER_CPU(int, in_ignored_frame);
2291 2291
2292 2292
2293static void 2293static void
@@ -2303,8 +2303,9 @@ static void backtrace_warning(void *data, char *msg)
2303 2303
2304static int backtrace_stack(void *data, char *name) 2304static int backtrace_stack(void *data, char *name)
2305{ 2305{
2306 per_cpu(in_nmi_frame, smp_processor_id()) = 2306 per_cpu(in_ignored_frame, smp_processor_id()) =
2307 x86_is_stack_id(NMI_STACK, name); 2307 x86_is_stack_id(NMI_STACK, name) ||
2308 x86_is_stack_id(DEBUG_STACK, name);
2308 2309
2309 return 0; 2310 return 0;
2310} 2311}
@@ -2313,7 +2314,7 @@ static void backtrace_address(void *data, unsigned long addr, int reliable)
2313{ 2314{
2314 struct perf_callchain_entry *entry = data; 2315 struct perf_callchain_entry *entry = data;
2315 2316
2316 if (per_cpu(in_nmi_frame, smp_processor_id())) 2317 if (per_cpu(in_ignored_frame, smp_processor_id()))
2317 return; 2318 return;
2318 2319
2319 if (reliable) 2320 if (reliable)