The following commit has been merged into the perf/core branch of tip: Commit-ID: dd3e249a0c0ad88098922803b149c788bb364c23 Gitweb: https://git.kernel.org/tip/dd3e249a0c0ad88098922803b149c788bb364c23 Author: Kan Liang <kan.liang@xxxxxxxxxxxxxxx> AuthorDate: Thu, 19 Mar 2020 13:25:07 -07:00 Committer: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx> CommitterDate: Sat, 18 Apr 2020 09:05:00 -03:00 perf machine: Factor out lbr_callchain_add_kernel_ip() Both caller and callee needs to add kernel ip to callchain. Factor out lbr_callchain_add_kernel_ip() to improve code readability. Signed-off-by: Kan Liang <kan.liang@xxxxxxxxxxxxxxx> Reviewed-by: Andi Kleen <ak@xxxxxxxxxxxxxxx> Acked-by: Jiri Olsa <jolsa@xxxxxxxxxx> Cc: Adrian Hunter <adrian.hunter@xxxxxxxxx> Cc: Alexey Budankov <alexey.budankov@xxxxxxxxxxxxxxx> Cc: Mathieu Poirier <mathieu.poirier@xxxxxxxxxx> Cc: Michael Ellerman <mpe@xxxxxxxxxxxxxx> Cc: Namhyung Kim <namhyung@xxxxxxxxxx> Cc: Pavel Gerasimov <pavel.gerasimov@xxxxxxxxx> Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx> Cc: Ravi Bangoria <ravi.bangoria@xxxxxxxxxxxxx> Cc: Stephane Eranian <eranian@xxxxxxxxxx> Cc: Vitaly Slobodskoy <vitaly.slobodskoy@xxxxxxxxx> Link: http://lore.kernel.org/lkml/20200319202517.23423-8-kan.liang@xxxxxxxxxxxxxxx Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx> --- tools/perf/util/machine.c | 67 +++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 0da540e..a7f75fd 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -2190,6 +2190,40 @@ static int remove_loops(struct branch_entry *l, int nr, return nr; } +static int lbr_callchain_add_kernel_ip(struct thread *thread, + struct callchain_cursor *cursor, + struct perf_sample *sample, + struct symbol **parent, + struct addr_location *root_al, + u64 branch_from, + bool callee, int end) +{ + struct ip_callchain *chain = sample->callchain; + u8 cpumode = PERF_RECORD_MISC_USER; + int err, i; + + if (callee) { + for (i = 0; i < end + 1; i++) { + err = add_callchain_ip(thread, cursor, parent, + root_al, &cpumode, chain->ips[i], + false, NULL, NULL, branch_from); + if (err) + return err; + } + return 0; + } + + for (i = end; i >= 0; i--) { + err = add_callchain_ip(thread, cursor, parent, + root_al, &cpumode, chain->ips[i], + false, NULL, NULL, branch_from); + if (err) + return err; + } + + return 0; +} + /* * Recolve LBR callstack chain sample * Return: @@ -2242,17 +2276,12 @@ static int resolve_lbr_callchain_sample(struct thread *thread, if (callchain_param.order == ORDER_CALLEE) { /* Add kernel ip */ - for (j = 0; j < i + 1; j++) { - ip = chain->ips[j]; - branch = false; - flags = NULL; - err = add_callchain_ip(thread, cursor, parent, - root_al, &cpumode, ip, - branch, flags, NULL, - branch_from); - if (err) - goto error; - } + err = lbr_callchain_add_kernel_ip(thread, cursor, sample, + parent, root_al, branch_from, + true, i); + if (err) + goto error; + /* Add LBR ip from first entries.to */ ip = entries[0].to; branch = true; @@ -2308,17 +2337,11 @@ static int resolve_lbr_callchain_sample(struct thread *thread, goto error; /* Add kernel ip */ - for (j = lbr_nr + 1; j < mix_chain_nr; j++) { - ip = chain->ips[i + 1 - (j - lbr_nr)]; - branch = false; - flags = NULL; - err = add_callchain_ip(thread, cursor, parent, - root_al, &cpumode, ip, - branch, flags, NULL, - branch_from); - if (err) - goto error; - } + err = lbr_callchain_add_kernel_ip(thread, cursor, sample, + parent, root_al, branch_from, + false, i); + if (err) + goto error; } return 1;