Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

perf callchain lbr: Make the leaf IP that of the sample

The current IP of a leaf function when reported from a perf record with
"--call-graph lbr" is the "to" field of the LBR branch stack record.

The sample for the event being recorded may be further into the function
and there may be inlining information associated with it.

Rather than use the branch stack "to" field in this case switch to the
callchain appending the sample->ip and thereby allowing the inline
information to show.

Before this change:
```
$ perf record --call-graph lbr perf test -w inlineloop
...
$ perf script --fields +srcline
...
perf-inlineloop 467586 4649.344493: 950905 cpu_core/cycles/P:
55dfda2829c0 parent+0x0 (perf)
inlineloop.c:31
55dfda282a96 inlineloop+0x86 (perf)
inlineloop.c:47
55dfda236420 run_workload+0x59 (perf)
builtin-test.c:715
55dfda236b03 cmd_test+0x413 (perf)
builtin-test.c:825
...
```

After this change:
```
$ perf record --call-graph lbr perf test -w inlineloop
...
$ perf script --fields +srcline
...
perf-inlineloop 529703 11878.680815: 950905 cpu_core/cycles/P:
555ce86be9e6 leaf+0x26
inlineloop.c:20 (inlined)
555ce86be9e6 middle+0x26
inlineloop.c:27 (inlined)
555ce86be9e6 parent+0x26 (perf)
inlineloop.c:32
555ce86bea96 inlineloop+0x86 (perf)
inlineloop.c:47
555ce8672420 run_workload+0x59 (perf)
builtin-test.c:715
555ce8672b03 cmd_test+0x413 (perf)
builtin-test.c:825
...
```

Reviewed-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Ian Rogers <irogers@google.com>
Acked-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Dmitriy Vyukov <dvyukov@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Krzysztof Łopatowski <krzysztof.m.lopatowski@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Weilin Wang <weilin.wang@intel.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Ian Rogers and committed by
Arnaldo Carvalho de Melo
04f81f45 a724a8fc

+16 -4
+16 -4
tools/perf/util/machine.c
··· 2423 2423 } 2424 2424 2425 2425 if (callee) { 2426 - /* Add LBR ip from first entries.to */ 2427 - ip = entries[0].to; 2426 + /* 2427 + * Set the (first) leaf function's IP to sample->ip (the 2428 + * location of the sample) but if not recorded use entries.to 2429 + */ 2430 + if (sample->ip) 2431 + ip = sample->ip; 2432 + else 2433 + ip = entries[0].to; 2428 2434 flags = &entries[0].flags; 2429 2435 *branch_from = entries[0].from; 2430 2436 err = add_callchain_ip(thread, cursor, parent, ··· 2483 2477 } 2484 2478 2485 2479 if (lbr_nr > 0) { 2486 - /* Add LBR ip from first entries.to */ 2487 - ip = entries[0].to; 2480 + /* 2481 + * Set the (first) leaf function's IP to sample->ip (the 2482 + * location of the sample) but if not recorded use entries.to 2483 + */ 2484 + if (sample->ip) 2485 + ip = sample->ip; 2486 + else 2487 + ip = entries[0].to; 2488 2488 flags = &entries[0].flags; 2489 2489 *branch_from = entries[0].from; 2490 2490 err = add_callchain_ip(thread, cursor, parent,