aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/probe-event.c
diff options
context:
space:
mode:
authorNaveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>2016-04-12 05:10:50 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2016-05-05 20:04:03 -0400
commit0b3c2264ae30ed692fd1ffd2b84c5fbdf737cb0d (patch)
treef26cae86be020c92c2a78880da9af369427f3456 /tools/perf/util/probe-event.c
parent239aeba764092b29dd7cab177cd47f472390622e (diff)
perf symbols: Fix kallsyms perf test on ppc64le
ppc64le functions have a Global Entry Point (GEP) and a Local Entry Point (LEP). While placing a probe, we always prefer the LEP since it catches function calls through both the GEP and the LEP. In order to do this, we fixup the function entry points during elf symbol table lookup to point to the LEPs. This works, but breaks 'perf test kallsyms' since the symbols loaded from the symbol table (pointing to the LEP) do not match the symbols in kallsyms. To fix this, we do not adjust all the symbols during symbol table load. Instead, we note down st_other in a newly introduced arch-specific member of perf symbol structure, and later use this to adjust the probe trace point. Reported-by: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com> Acked-by: Balbir Singh <bsingharora@gmail.com> Cc: Mark Wielaard <mjw@redhat.com> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com> Cc: linuxppc-dev@lists.ozlabs.org Link: http://lkml.kernel.org/r/6be7c2b17e370100c2f79dd444509df7929bdd3e.1460451721.git.naveen.n.rao@linux.vnet.ibm.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/probe-event.c')
-rw-r--r--tools/perf/util/probe-event.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 85d82f4dc5e9..c82c625395ab 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -2477,7 +2477,8 @@ static int find_probe_functions(struct map *map, char *name,
2477 2477
2478void __weak arch__fix_tev_from_maps(struct perf_probe_event *pev __maybe_unused, 2478void __weak arch__fix_tev_from_maps(struct perf_probe_event *pev __maybe_unused,
2479 struct probe_trace_event *tev __maybe_unused, 2479 struct probe_trace_event *tev __maybe_unused,
2480 struct map *map __maybe_unused) { } 2480 struct map *map __maybe_unused,
2481 struct symbol *sym __maybe_unused) { }
2481 2482
2482/* 2483/*
2483 * Find probe function addresses from map. 2484 * Find probe function addresses from map.
@@ -2614,7 +2615,7 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev,
2614 strdup_or_goto(pev->args[i].type, 2615 strdup_or_goto(pev->args[i].type,
2615 nomem_out); 2616 nomem_out);
2616 } 2617 }
2617 arch__fix_tev_from_maps(pev, tev, map); 2618 arch__fix_tev_from_maps(pev, tev, map, sym);
2618 } 2619 }
2619 if (ret == skipped) { 2620 if (ret == skipped) {
2620 ret = -ENOENT; 2621 ret = -ENOENT;