Commit d5c2e2c1 authored by Naveen N. Rao's avatar Naveen N. Rao Committed by Arnaldo Carvalho de Melo

perf probe ppc64le: Prefer symbol table lookup over DWARF

Use symbol table lookups by default if DWARF is not necessary, since
powerpc ABIv2 encodes local entry points in the symbol table and the
function entry address in DWARF may not be appropriate for kprobes, as
described here:

https://sourceware.org/bugzilla/show_bug.cgi?id=17638

"The DWARF address ranges deliberately include the *whole* function,
both global and local entry points."
...
"If you want to set probes on a local entry point, you should look up
the symbol in the main symbol table (not DWARF), and check the st_other
bits; they will indicate whether the function has a local entry point,
and what its offset from the global entry point is.  Note that GDB does
the same when setting a breakpoint on a function entry."
Signed-off-by: default avatarNaveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Reviewed-by: default avatarSrikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Cc: linuxppc-dev@lists.ozlabs.org
Link: http://lkml.kernel.org/r/88a10e22f4aaba2aef812824ca4b10d7beeea012.1430217967.git.naveen.n.rao@linux.vnet.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent c50fc0a4
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "debug.h" #include "debug.h"
#include "symbol.h" #include "symbol.h"
#include "map.h" #include "map.h"
#include "probe-event.h"
#ifdef HAVE_LIBELF_SUPPORT #ifdef HAVE_LIBELF_SUPPORT
bool elf__needs_adjust_symbols(GElf_Ehdr ehdr) bool elf__needs_adjust_symbols(GElf_Ehdr ehdr)
...@@ -57,3 +58,10 @@ int arch__compare_symbol_names(const char *namea, const char *nameb) ...@@ -57,3 +58,10 @@ int arch__compare_symbol_names(const char *namea, const char *nameb)
return strcmp(namea, nameb); return strcmp(namea, nameb);
} }
#endif #endif
#if defined(_CALL_ELF) && _CALL_ELF == 2
bool arch__prefers_symtab(void)
{
return true;
}
#endif
...@@ -2567,6 +2567,8 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev, ...@@ -2567,6 +2567,8 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev,
goto out; goto out;
} }
bool __weak arch__prefers_symtab(void) { return false; }
static int convert_to_probe_trace_events(struct perf_probe_event *pev, static int convert_to_probe_trace_events(struct perf_probe_event *pev,
struct probe_trace_event **tevs, struct probe_trace_event **tevs,
int max_tevs, const char *target) int max_tevs, const char *target)
...@@ -2582,6 +2584,12 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev, ...@@ -2582,6 +2584,12 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev,
} }
} }
if (arch__prefers_symtab() && !perf_probe_event_need_dwarf(pev)) {
ret = find_probe_trace_events_from_map(pev, tevs, max_tevs, target);
if (ret > 0)
return ret; /* Found in symbol table */
}
/* Convert perf_probe_event with debuginfo */ /* Convert perf_probe_event with debuginfo */
ret = try_to_find_probe_trace_events(pev, tevs, max_tevs, target); ret = try_to_find_probe_trace_events(pev, tevs, max_tevs, target);
if (ret != 0) if (ret != 0)
......
...@@ -135,6 +135,7 @@ extern int show_available_vars(struct perf_probe_event *pevs, int npevs, ...@@ -135,6 +135,7 @@ extern int show_available_vars(struct perf_probe_event *pevs, int npevs,
struct strfilter *filter, bool externs); struct strfilter *filter, bool externs);
extern int show_available_funcs(const char *module, struct strfilter *filter, extern int show_available_funcs(const char *module, struct strfilter *filter,
bool user); bool user);
bool arch__prefers_symtab(void);
/* Maximum index number of event-name postfix */ /* Maximum index number of event-name postfix */
#define MAX_EVENT_INDEX 1024 #define MAX_EVENT_INDEX 1024
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment