* [PATCH v1 1/2] perf callchain lbr: Make the leaf IP that of the sample
@ 2026-02-05 20:56 Ian Rogers
2026-02-05 20:56 ` [PATCH v1 2/2] perf test addr2line_inlines: Ensure inline information shows on LBR leaves Ian Rogers
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Ian Rogers @ 2026-02-05 20:56 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Alexander Shishkin, Jiri Olsa, Ian Rogers,
Adrian Hunter, James Clark, Andi Kleen, Dmitry Vyukov,
Krzysztof Łopatowski, linux-perf-users, linux-kernel,
Dapeng Mi, Weilin Wang
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
...
```
Signed-off-by: Ian Rogers <irogers@google.com>
---
tools/perf/util/machine.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index 5b0f5a48ffd4..e76f8c86e62a 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -2423,8 +2423,14 @@ static int lbr_callchain_add_lbr_ip(struct thread *thread,
}
if (callee) {
- /* Add LBR ip from first entries.to */
- ip = entries[0].to;
+ /*
+ * Set the (first) leaf function's IP to sample->ip (the
+ * location of the sample) but if not recorded use entries.to
+ */
+ if (sample->ip)
+ ip = sample->ip;
+ else
+ ip = entries[0].to;
flags = &entries[0].flags;
*branch_from = entries[0].from;
err = add_callchain_ip(thread, cursor, parent,
@@ -2477,8 +2483,14 @@ static int lbr_callchain_add_lbr_ip(struct thread *thread,
}
if (lbr_nr > 0) {
- /* Add LBR ip from first entries.to */
- ip = entries[0].to;
+ /*
+ * Set the (first) leaf function's IP to sample->ip (the
+ * location of the sample) but if not recorded use entries.to
+ */
+ if (sample->ip)
+ ip = sample->ip;
+ else
+ ip = entries[0].to;
flags = &entries[0].flags;
*branch_from = entries[0].from;
err = add_callchain_ip(thread, cursor, parent,
--
2.53.0.rc2.204.g2597b5adb4-goog
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH v1 2/2] perf test addr2line_inlines: Ensure inline information shows on LBR leaves
2026-02-05 20:56 [PATCH v1 1/2] perf callchain lbr: Make the leaf IP that of the sample Ian Rogers
@ 2026-02-05 20:56 ` Ian Rogers
2026-02-06 0:10 ` [PATCH v1 1/2] perf callchain lbr: Make the leaf IP that of the sample Andi Kleen
2026-02-06 1:44 ` Mi, Dapeng
2 siblings, 0 replies; 6+ messages in thread
From: Ian Rogers @ 2026-02-05 20:56 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Alexander Shishkin, Jiri Olsa, Ian Rogers,
Adrian Hunter, James Clark, Andi Kleen, Dmitry Vyukov,
Krzysztof Łopatowski, linux-perf-users, linux-kernel,
Dapeng Mi, Weilin Wang
Expand the addr2line inline function testing to also run for an LBR
callchain, skipping if LBR support isn't present.
Signed-off-by: Ian Rogers <irogers@google.com>
---
tools/perf/tests/shell/addr2line_inlines.sh | 28 +++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/tools/perf/tests/shell/addr2line_inlines.sh b/tools/perf/tests/shell/addr2line_inlines.sh
index ce30d9c7e0bf..e8754ef2d7f2 100755
--- a/tools/perf/tests/shell/addr2line_inlines.sh
+++ b/tools/perf/tests/shell/addr2line_inlines.sh
@@ -61,8 +61,36 @@ test_dwarf() {
fi
}
+test_lbr() {
+ echo "Inline unwinding LBR verification test"
+ if [ ! -f /sys/bus/event_source/devices/cpu/caps/branches ] &&
+ [ ! -f /sys/bus/event_source/devices/cpu_core/caps/branches ]
+ then
+ echo "Skip: only x86 CPUs support LBR"
+ return
+ fi
+
+ # Record data. Currently only dwarf callchains support inlined functions.
+ perf record --call-graph lbr -e cycles:u -o "${perf_data}" -- perf test -w inlineloop 1
+
+ # Check output with inline (default) and srcline
+ perf script -i "${perf_data}" --fields +srcline > "${perf_script_txt}"
+
+ # Expect the leaf and middle functions to occur on lines in the 20s, with
+ # the non-inlined parent function on a line in the 30s.
+ if grep -q "inlineloop.c:2. (inlined)" "${perf_script_txt}" &&
+ grep -q "inlineloop.c:3.$" "${perf_script_txt}"
+ then
+ echo "Inline unwinding lbr verification test [Success]"
+ else
+ echo "Inline unwinding lbr verification test [Failed missing inlined functions]"
+ err=1
+ fi
+}
+
test_fp
test_dwarf
+test_lbr
cleanup
exit $err
--
2.53.0.rc2.204.g2597b5adb4-goog
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH v1 1/2] perf callchain lbr: Make the leaf IP that of the sample
2026-02-05 20:56 [PATCH v1 1/2] perf callchain lbr: Make the leaf IP that of the sample Ian Rogers
2026-02-05 20:56 ` [PATCH v1 2/2] perf test addr2line_inlines: Ensure inline information shows on LBR leaves Ian Rogers
@ 2026-02-06 0:10 ` Andi Kleen
2026-02-06 1:44 ` Mi, Dapeng
2 siblings, 0 replies; 6+ messages in thread
From: Andi Kleen @ 2026-02-06 0:10 UTC (permalink / raw)
To: Ian Rogers
Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
James Clark, Dmitry Vyukov, Krzysztof Łopatowski,
linux-perf-users, linux-kernel, Dapeng Mi, Weilin Wang
> Signed-off-by: Ian Rogers <irogers@google.com>
Makes sense.
Reviewed-by: Andi Kleen <ak@linux.intel.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v1 1/2] perf callchain lbr: Make the leaf IP that of the sample
2026-02-05 20:56 [PATCH v1 1/2] perf callchain lbr: Make the leaf IP that of the sample Ian Rogers
2026-02-05 20:56 ` [PATCH v1 2/2] perf test addr2line_inlines: Ensure inline information shows on LBR leaves Ian Rogers
2026-02-06 0:10 ` [PATCH v1 1/2] perf callchain lbr: Make the leaf IP that of the sample Andi Kleen
@ 2026-02-06 1:44 ` Mi, Dapeng
2026-02-06 21:10 ` Arnaldo Carvalho de Melo
2 siblings, 1 reply; 6+ messages in thread
From: Mi, Dapeng @ 2026-02-06 1:44 UTC (permalink / raw)
To: Ian Rogers, Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
James Clark, Andi Kleen, Dmitry Vyukov, Krzysztof Łopatowski,
linux-perf-users, linux-kernel, Weilin Wang
On 2/6/2026 4:56 AM, Ian Rogers wrote:
> 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
> ...
> ```
>
> Signed-off-by: Ian Rogers <irogers@google.com>
> ---
> tools/perf/util/machine.c | 20 ++++++++++++++++----
> 1 file changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
> index 5b0f5a48ffd4..e76f8c86e62a 100644
> --- a/tools/perf/util/machine.c
> +++ b/tools/perf/util/machine.c
> @@ -2423,8 +2423,14 @@ static int lbr_callchain_add_lbr_ip(struct thread *thread,
> }
>
> if (callee) {
> - /* Add LBR ip from first entries.to */
> - ip = entries[0].to;
> + /*
> + * Set the (first) leaf function's IP to sample->ip (the
> + * location of the sample) but if not recorded use entries.to
> + */
> + if (sample->ip)
> + ip = sample->ip;
> + else
> + ip = entries[0].to;
> flags = &entries[0].flags;
> *branch_from = entries[0].from;
> err = add_callchain_ip(thread, cursor, parent,
> @@ -2477,8 +2483,14 @@ static int lbr_callchain_add_lbr_ip(struct thread *thread,
> }
>
> if (lbr_nr > 0) {
> - /* Add LBR ip from first entries.to */
> - ip = entries[0].to;
> + /*
> + * Set the (first) leaf function's IP to sample->ip (the
> + * location of the sample) but if not recorded use entries.to
> + */
> + if (sample->ip)
> + ip = sample->ip;
> + else
> + ip = entries[0].to;
> flags = &entries[0].flags;
> *branch_from = entries[0].from;
> err = add_callchain_ip(thread, cursor, parent,
LGTM. Thanks.
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH v1 1/2] perf callchain lbr: Make the leaf IP that of the sample
2026-02-06 1:44 ` Mi, Dapeng
@ 2026-02-06 21:10 ` Arnaldo Carvalho de Melo
2026-02-09 0:43 ` Mi, Dapeng
0 siblings, 1 reply; 6+ messages in thread
From: Arnaldo Carvalho de Melo @ 2026-02-06 21:10 UTC (permalink / raw)
To: Mi, Dapeng
Cc: Ian Rogers, Peter Zijlstra, Ingo Molnar, Namhyung Kim,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, James Clark,
Andi Kleen, Dmitry Vyukov, Krzysztof Łopatowski,
linux-perf-users, linux-kernel, Weilin Wang
On Fri, Feb 06, 2026 at 09:44:04AM +0800, Mi, Dapeng wrote:
>
> On 2/6/2026 4:56 AM, Ian Rogers wrote:
> > 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
> > ...
> > ```
> >
> > Signed-off-by: Ian Rogers <irogers@google.com>
> > ---
> > tools/perf/util/machine.c | 20 ++++++++++++++++----
> > 1 file changed, 16 insertions(+), 4 deletions(-)
> >
> > diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
> > index 5b0f5a48ffd4..e76f8c86e62a 100644
> > --- a/tools/perf/util/machine.c
> > +++ b/tools/perf/util/machine.c
> > @@ -2423,8 +2423,14 @@ static int lbr_callchain_add_lbr_ip(struct thread *thread,
> > }
> >
> > if (callee) {
> > - /* Add LBR ip from first entries.to */
> > - ip = entries[0].to;
> > + /*
> > + * Set the (first) leaf function's IP to sample->ip (the
> > + * location of the sample) but if not recorded use entries.to
> > + */
> > + if (sample->ip)
> > + ip = sample->ip;
> > + else
> > + ip = entries[0].to;
> > flags = &entries[0].flags;
> > *branch_from = entries[0].from;
> > err = add_callchain_ip(thread, cursor, parent,
> > @@ -2477,8 +2483,14 @@ static int lbr_callchain_add_lbr_ip(struct thread *thread,
> > }
> >
> > if (lbr_nr > 0) {
> > - /* Add LBR ip from first entries.to */
> > - ip = entries[0].to;
> > + /*
> > + * Set the (first) leaf function's IP to sample->ip (the
> > + * location of the sample) but if not recorded use entries.to
> > + */
> > + if (sample->ip)
> > + ip = sample->ip;
> > + else
> > + ip = entries[0].to;
> > flags = &entries[0].flags;
> > *branch_from = entries[0].from;
> > err = add_callchain_ip(thread, cursor, parent,
>
> LGTM. Thanks.
Next time please express that with an Acked-by, that way b4 will collect
it.
I'm adding it this time:
Acked-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
ok?
- Arnaldo
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH v1 1/2] perf callchain lbr: Make the leaf IP that of the sample
2026-02-06 21:10 ` Arnaldo Carvalho de Melo
@ 2026-02-09 0:43 ` Mi, Dapeng
0 siblings, 0 replies; 6+ messages in thread
From: Mi, Dapeng @ 2026-02-09 0:43 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ian Rogers, Peter Zijlstra, Ingo Molnar, Namhyung Kim,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, James Clark,
Andi Kleen, Dmitry Vyukov, Krzysztof Łopatowski,
linux-perf-users, linux-kernel, Weilin Wang
On 2/7/2026 5:10 AM, Arnaldo Carvalho de Melo wrote:
> On Fri, Feb 06, 2026 at 09:44:04AM +0800, Mi, Dapeng wrote:
>> On 2/6/2026 4:56 AM, Ian Rogers wrote:
>>> 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
>>> ...
>>> ```
>>>
>>> Signed-off-by: Ian Rogers <irogers@google.com>
>>> ---
>>> tools/perf/util/machine.c | 20 ++++++++++++++++----
>>> 1 file changed, 16 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
>>> index 5b0f5a48ffd4..e76f8c86e62a 100644
>>> --- a/tools/perf/util/machine.c
>>> +++ b/tools/perf/util/machine.c
>>> @@ -2423,8 +2423,14 @@ static int lbr_callchain_add_lbr_ip(struct thread *thread,
>>> }
>>>
>>> if (callee) {
>>> - /* Add LBR ip from first entries.to */
>>> - ip = entries[0].to;
>>> + /*
>>> + * Set the (first) leaf function's IP to sample->ip (the
>>> + * location of the sample) but if not recorded use entries.to
>>> + */
>>> + if (sample->ip)
>>> + ip = sample->ip;
>>> + else
>>> + ip = entries[0].to;
>>> flags = &entries[0].flags;
>>> *branch_from = entries[0].from;
>>> err = add_callchain_ip(thread, cursor, parent,
>>> @@ -2477,8 +2483,14 @@ static int lbr_callchain_add_lbr_ip(struct thread *thread,
>>> }
>>>
>>> if (lbr_nr > 0) {
>>> - /* Add LBR ip from first entries.to */
>>> - ip = entries[0].to;
>>> + /*
>>> + * Set the (first) leaf function's IP to sample->ip (the
>>> + * location of the sample) but if not recorded use entries.to
>>> + */
>>> + if (sample->ip)
>>> + ip = sample->ip;
>>> + else
>>> + ip = entries[0].to;
>>> flags = &entries[0].flags;
>>> *branch_from = entries[0].from;
>>> err = add_callchain_ip(thread, cursor, parent,
>> LGTM. Thanks.
> Next time please express that with an Acked-by, that way b4 will collect
> it.
>
> I'm adding it this time:
>
> Acked-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
>
> ok?
Yeah. Thanks.
>
> - Arnaldo
>
>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-02-09 0:43 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-05 20:56 [PATCH v1 1/2] perf callchain lbr: Make the leaf IP that of the sample Ian Rogers
2026-02-05 20:56 ` [PATCH v1 2/2] perf test addr2line_inlines: Ensure inline information shows on LBR leaves Ian Rogers
2026-02-06 0:10 ` [PATCH v1 1/2] perf callchain lbr: Make the leaf IP that of the sample Andi Kleen
2026-02-06 1:44 ` Mi, Dapeng
2026-02-06 21:10 ` Arnaldo Carvalho de Melo
2026-02-09 0:43 ` Mi, Dapeng
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox