Patch "perf probe: Find versioned symbols from map" has been added to the 4.15-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
perf probe: Find versioned symbols from map
to the 4.15-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
perf-probe-find-versioned-symbols-from-map.patch
and it can be found in the queue-4.15 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Mon Apr 9 10:16:32 CEST 2018
From: Masami Hiramatsu <[email protected]>
Date: Sat, 9 Dec 2017 01:28:12 +0900
Subject: perf probe: Find versioned symbols from map
From: Masami Hiramatsu <[email protected]>
[ Upstream commit 4b3a2716dd785fabb9f6ac80c1d53cb29a88169d ]
Commit d80406453ad4 ("perf symbols: Allow user probes on versioned symbols") allows user to find default versioned symbols (with "@@") in map. However, it did not enable normal versioned symbol (with "@") for perf-probe. E.g.
=====
# ./perf probe -x /lib64/libc-2.25.so malloc_get_state
Failed to find symbol malloc_get_state in /usr/lib64/libc-2.25.so
Error: Failed to add events.
=====This solves above issue by improving perf-probe symbol search function, as below.
=====
# ./perf probe -x /lib64/libc-2.25.so malloc_get_state
Added new event:
probe_libc:malloc_get_state (on malloc_get_state in /usr/lib64/libc-2.25.so)You can now use it in all perf tools, such as:
perf record -e probe_libc:malloc_get_state -aR sleep 1
# ./perf probe -l
probe_libc:malloc_get_state (on malloc_get_state@GLIBC_2.2.5 in /usr/lib64/libc-2.25.so)
=====--- tools/perf/arch/powerpc/util/sym-handling.c | 8 ++++++++ tools/perf/util/probe-event.c | 20 ++++++++++++++++++-- tools/perf/util/symbol.c | 5 +++++ tools/perf/util/symbol.h | 1 + 4 files changed, 32 insertions(+), 2 deletions(-)
tools/perf/arch/powerpc/util/sym-handling.c +8 -0
@@ -64,6 +64,14 @@ int arch__compare_symbol_names_n(const c return strncmp(namea, nameb, n); } + +const char *arch__normalize_symbol_name (const char *name) +{ +/* Skip over initial dot */ +if (name && *name =='.' ) + name++; +return name; +}#endif #if defined(_CALL_ELF) && _CALL_ELF ==2
tools/perf/util/probe-event.c +18 -2
@@ -2792,16 +2792,32 @@ static int find_probe_functions(struct mint found =0 ;struct symbol *sym;struct rb_node *tmp; +const char *norm, *ver; +char *buf =NULL ;if (map__load (map) <0 )return 0 ;map__for_each_symbol (map, sym, tmp) { -if (strglobmatch (sym->name, name)) { + norm =arch__normalize_symbol_name (sym->name); +if (!norm) +continue ; + +/* We don't care about default symbol or not */ + ver =strchr (norm,'@' ); +if (ver) { + buf =strndup (norm, ver - norm); +if (!buf) +return -ENOMEM ; + norm = buf; + } +if (strglobmatch (norm, name)) { found++;if (syms && found < probe_conf.max_probes) syms[found -1 ] = sym; } +if (buf) +zfree (&buf); }return found;
@@ -2847,7 +2863,7 @@ static int find_probe_trace_events_from_* same name but different addresses, this lists all the symbols. */ num_matched_functions =find_probe_functions (map, pp->function, syms); -if (num_matched_functions ==0 ) { +if (num_matched_functions <=0 ) {pr_err ("Failed to find symbol %s in %s\n" , pp->function, pev->target ? :"kernel" ); ret = -ENOENT ;
tools/perf/util/symbol.c +5 -0
@@ -94,6 +94,11 @@ static int prefix_underscores_count(consreturn tail - str; } +const char *__weak arch__normalize_symbol_name (const char *name) +{ +return name; +} +int __weak arch__compare_symbol_names (const char *namea,const char *nameb) {return strcmp (namea, nameb);
tools/perf/util/symbol.h +1 -0
@@ -349,6 +349,7 @@ bool elf__needs_adjust_symbols(GElf_Ehdrvoid arch__sym_update (struct symbol *s,GElf_Sym *sym);#endif +const char *arch__normalize_symbol_name (const char *name);#define SYMBOL_A 0#define SYMBOL_B 1
Patches currently in stable-queue which might be from [email protected] are
queue-4.15/perf-probe-find-versioned-symbols-from-map.patch queue-4.15/perf-probe-add-warning-message-if-there-is-unexpected-event-name.patch