Commit 339ce1a4dc2ca26444c4f65c31b71a5056f3bb0b

Authored by Anton Blanchard
Committed by Frederic Weisbecker
1 parent 408f0d18ba

perf: Fix inconsistency between IP and callchain sampling

When running perf across all cpus with backtracing (-a -g), sometimes we
get samples without associated backtraces:

    23.44%         init  [kernel]                     [k] restore
    11.46%         init                       eeba0c  [k] 0x00000000eeba0c
     6.77%      swapper  [kernel]                     [k] .perf_ctx_adjust_freq
     5.73%         init  [kernel]                     [k] .__trace_hcall_entry
     4.69%         perf  libc-2.9.so                  [.] 0x0000000006bb8c
                       |
                       |--11.11%-- 0xfffa941bbbc

It turns out the backtrace code has a check for the idle task and the IP
sampling does not. This creates problems when profiling an interrupt
heavy workload (in my case 10Gbit ethernet) since we get no backtraces
for interrupts received while idle (ie most of the workload).

Right now x86 and sh check that current is not NULL, which should never
happen so remove that too.

Idle task's exclusion must be performed from the core code, on top
of perf_event_attr:exclude_idle.

Signed-off-by: Anton Blanchard <anton@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mundt <lethal@linux-sh.org>
LKML-Reference: <20100118054707.GT12666@kryten>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>

Showing 3 changed files with 0 additions and 9 deletions Side-by-side Diff

arch/powerpc/kernel/perf_callchain.c
... ... @@ -495,9 +495,6 @@
495 495  
496 496 entry->nr = 0;
497 497  
498   - if (current->pid == 0) /* idle task? */
499   - return entry;
500   -
501 498 if (!user_mode(regs)) {
502 499 perf_callchain_kernel(regs, entry);
503 500 if (current->mm)
arch/sh/kernel/perf_callchain.c
... ... @@ -68,9 +68,6 @@
68 68  
69 69 is_user = user_mode(regs);
70 70  
71   - if (!current || current->pid == 0)
72   - return;
73   -
74 71 if (is_user && current->state != TASK_RUNNING)
75 72 return;
76 73  
arch/x86/kernel/cpu/perf_event.c
... ... @@ -2425,9 +2425,6 @@
2425 2425  
2426 2426 is_user = user_mode(regs);
2427 2427  
2428   - if (!current || current->pid == 0)
2429   - return;
2430   -
2431 2428 if (is_user && current->state != TASK_RUNNING)
2432 2429 return;
2433 2430