Skip to content

Commit

Permalink
perf probe ppc: Use the right prefix when ignoring SyS symbols on ppc
Browse files Browse the repository at this point in the history
Use the proper prefix when ignoring SyS symbols on ppc ABIv1. While at
it, generalize symbol selection so architectures can implement their own
logic.

Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Reviewed-by: Srikar 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/adf1f98b121ecaf292777fe5cc69fe1038feabce.1430217967.git.naveen.n.rao@linux.vnet.ibm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Naveen N. Rao authored and Arnaldo Carvalho de Melo committed May 4, 2015
1 parent d233209 commit fb6d594
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 9 deletions.
20 changes: 20 additions & 0 deletions tools/perf/arch/powerpc/util/sym-handling.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,23 @@ bool elf__needs_adjust_symbols(GElf_Ehdr ehdr)
ehdr.e_type == ET_DYN;
}
#endif

#if !defined(_CALL_ELF) || _CALL_ELF != 2
int arch__choose_best_symbol(struct symbol *syma,
struct symbol *symb __maybe_unused)
{
char *sym = syma->name;

/* Skip over any initial dot */
if (*sym == '.')
sym++;

/* Avoid "SyS" kernel syscall aliases */
if (strlen(sym) >= 3 && !strncmp(sym, "SyS", 3))
return SYMBOL_B;
if (strlen(sym) >= 10 && !strncmp(sym, "compat_SyS", 10))
return SYMBOL_B;

return SYMBOL_A;
}
#endif
21 changes: 12 additions & 9 deletions tools/perf/util/symbol.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,17 @@ static int prefix_underscores_count(const char *str)
return tail - str;
}

#define SYMBOL_A 0
#define SYMBOL_B 1
int __weak arch__choose_best_symbol(struct symbol *syma,
struct symbol *symb __maybe_unused)
{
/* Avoid "SyS" kernel syscall aliases */
if (strlen(syma->name) >= 3 && !strncmp(syma->name, "SyS", 3))
return SYMBOL_B;
if (strlen(syma->name) >= 10 && !strncmp(syma->name, "compat_SyS", 10))
return SYMBOL_B;

return SYMBOL_A;
}

static int choose_best_symbol(struct symbol *syma, struct symbol *symb)
{
Expand Down Expand Up @@ -134,13 +143,7 @@ static int choose_best_symbol(struct symbol *syma, struct symbol *symb)
else if (na < nb)
return SYMBOL_B;

/* Avoid "SyS" kernel syscall aliases */
if (na >= 3 && !strncmp(syma->name, "SyS", 3))
return SYMBOL_B;
if (na >= 10 && !strncmp(syma->name, "compat_SyS", 10))
return SYMBOL_B;

return SYMBOL_A;
return arch__choose_best_symbol(syma, symb);
}

void symbols__fixup_duplicate(struct rb_root *symbols)
Expand Down
5 changes: 5 additions & 0 deletions tools/perf/util/symbol.h
Original file line number Diff line number Diff line change
Expand Up @@ -307,4 +307,9 @@ int setup_intlist(struct intlist **list, const char *list_str,
bool elf__needs_adjust_symbols(GElf_Ehdr ehdr);
#endif

#define SYMBOL_A 0
#define SYMBOL_B 1

int arch__choose_best_symbol(struct symbol *syma, struct symbol *symb);

#endif /* __PERF_SYMBOL */

0 comments on commit fb6d594

Please sign in to comment.