Messages in this thread Patch in this message | | | From | kan.liang@linux ... | Subject | [PATCH V3 07/17] perf machine: Factor out lbr_callchain_add_kernel_ip() | Date | Fri, 13 Mar 2020 11:33:09 -0700 |
| |
From: Kan Liang <kan.liang@linux.intel.com>
Both caller and callee needs to add kernel ip to callchain. Factor out lbr_callchain_add_kernel_ip() to improve code readability.
Reviewed-by: Andi Kleen <ak@linux.intel.com> Signed-off-by: Kan Liang <kan.liang@linux.intel.com> --- 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 cf2c97a6ef81..ef26f28eacea 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -2159,6 +2159,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: @@ -2211,17 +2245,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; @@ -2277,17 +2306,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; -- 2.17.1
| |