perf thread: Introduce thread__find_symbol()
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: 4546263d72e22ea84b49dafad26d8ca679d5e83d Gitweb: https://git.kernel.org/tip/4546263d72e22ea84b49dafad26d8ca679d5e83d Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Tue, 24 Apr 2018 11:24:49 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 26 Apr 2018 13:47:07 -0300
perf thread: Introduce thread__find_symbol()
Out of thread__find_addr_location(..., MAP__FUNCTION, ...), idea here is to continue removing references to MAP__{FUNCTION,VARIABLE} ahead of getting both types of symbols in the same rbtree, as various places do two lookups, looking first at MAP__FUNCTION, then at MAP__VARIABLE.
So thread__find_symbol() will eventually do just that, and 'struct symbol' will have the symbol type, for code that cares about that.
Cc Adrian Hunter <[email protected]>
Cc David Ahern <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Wang Nan <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/arch/powerpc/util/skip-callchain-idx.c | 3 +-- tools/perf/builtin-timechart.c | 3 +-- tools/perf/builtin-trace.c | 9 +++------ tools/perf/util/event.c | 6 +++--- tools/perf/util/machine.c | 7 +++---- tools/perf/util/thread.c | 2 +- tools/perf/util/thread.h | 11 ++++++++--- tools/perf/util/unwind-libdw.c | 9 +++++---- tools/perf/util/unwind-libunwind-local.c | 3 +-- 9 files changed, 26 insertions(+), 27 deletions(-)
tools/perf/arch/powerpc/util/skip-callchain-idx.c +1 -2
@@ -248,8 +248,7 @@ int arch_skip_callchain_idx(struct thread *thread, struct ip_callchain *chain) ip = chain->ips[2 ]; -thread__find_addr_location (thread,PERF_RECORD_MISC_USER , -MAP__FUNCTION , ip, &al); +thread__find_symbol (thread,PERF_RECORD_MISC_USER , ip, &al);if (al.map) dso = al.map->dso;
tools/perf/builtin-timechart.c +1 -2
@@ -533,8 +533,7 @@ static const char *cat_backtrace(union perf_event *event, } tal.filtered =0 ; -thread__find_addr_location (al.thread, cpumode, -MAP__FUNCTION , ip, &tal); +thread__find_symbol (al.thread, cpumode, ip, &tal);if (tal.sym) fprintf(f, "..... %016" PRIx64 " %s\n", ip,
tools/perf/builtin-trace.c +3 -6
@@ -2024,8 +2024,7 @@ static int trace__pgfault(struct trace *trace,if (trace->summary_only) goto out; -thread__find_addr_location (thread, sample->cpumode,MAP__FUNCTION , - sample->ip, &al); +thread__find_symbol (thread, sample->cpumode, sample->ip, &al);trace__fprintf_entry_head (trace, thread,0 , true, sample->time, trace->output);
@@ -2037,12 +2036,10 @@ static int trace__pgfault(struct trace *trace,fprintf (trace->output,"] => " ); -thread__find_addr_location (thread, sample->cpumode,MAP__VARIABLE , - sample->addr, &al); +__thread__find_symbol (thread, sample->cpumode,MAP__VARIABLE , sample->addr, &al);if (!al.map) { -thread__find_addr_location (thread, sample->cpumode, -MAP__FUNCTION , sample->addr, &al); +thread__find_symbol (thread, sample->cpumode, sample->addr, &al);if (al.map) map_type ='x' ;
tools/perf/util/event.c +3 -3
@@ -1564,9 +1564,9 @@ try_again: } } -void thread__find_addr_location (struct thread *thread, -u8 cpumode,enum map_type type,u64 addr, -struct addr_location *al) +void __thread__find_symbol (struct thread *thread,u8 cpumode, +enum map_type type,u64 addr, +struct addr_location *al) {__thread__find_map (thread, cpumode, type, addr, al);if (al->map !=NULL )
tools/perf/util/machine.c +3 -4
@@ -1681,14 +1681,14 @@ static void ip__resolve_data(struct thread *thread,memset (&al,0 ,sizeof (al)); -thread__find_addr_location (thread, m,MAP__VARIABLE , addr, &al); +__thread__find_symbol (thread, m,MAP__VARIABLE , addr, &al);if (al.map ==NULL ) {/* * some shared data regions have execute bit set which puts * their mapping in the MAP__FUNCTION type array. * Check there as a fallback option before dropping the sample. */ -thread__find_addr_location (thread, m,MAP__FUNCTION , addr, &al); +thread__find_symbol (thread, m, addr, &al); } ams->addr = addr;
@@ -1784,8 +1784,7 @@ static int add_callchain_ip(struct thread *thread, }return 0 ; } -thread__find_addr_location (thread, *cpumode,MAP__FUNCTION , - ip, &al); +thread__find_symbol (thread, *cpumode, ip, &al); }if (al.sym !=NULL ) {
tools/perf/util/thread.c +1 -1
@@ -384,7 +384,7 @@ void thread__find_cpumode_addr_location(struct thread *thread, };for (i =0 ; i <ARRAY_SIZE (cpumodes); i++) { -thread__find_addr_location (thread, cpumodes[i], type, addr, al); +__thread__find_symbol (thread, cpumodes[i], type, addr, al);if (al->map)break ; }
tools/perf/util/thread.h +8 -3
@@ -101,9 +101,14 @@ static inline void thread__find_map(struct thread *thread, u8 cpumode,__thread__find_map (thread, cpumode,MAP__FUNCTION , addr, al); } -void thread__find_addr_location (struct thread *thread, -u8 cpumode,enum map_type type,u64 addr, -struct addr_location *al); +void __thread__find_symbol (struct thread *thread,u8 cpumode,enum map_type type, +u64 addr,struct addr_location *al); + +static inline void thread__find_symbol (struct thread *thread,u8 cpumode, +u64 addr,struct addr_location *al) +{ +return __thread__find_symbol (thread, cpumode,MAP__FUNCTION , addr, al); +} void thread__find_cpumode_addr_location(struct thread *thread, enum map_type type, u64 addr,
tools/perf/util/unwind-libdw.c +5 -4
@@ -28,10 +28,11 @@ static int __report_module(struct addr_location *al, u64 ip, {Dwfl_Module *mod;struct dso *dso =NULL ; - -thread__find_addr_location (ui->thread, -PERF_RECORD_MISC_USER , -MAP__FUNCTION , ip, al); +/* +* Some callers will use al->sym, so we can't just use the +* cheaper thread__find_map() here. +*/ +thread__find_symbol (ui->thread,PERF_RECORD_MISC_USER , ip, al);if (al->map) dso = al->map->dso;
tools/perf/util/unwind-libunwind-local.c +1 -2
@@ -585,8 +585,7 @@ static int entry(u64 ip, struct thread *thread,struct unwind_entry e;struct addr_location al; -thread__find_addr_location (thread,PERF_RECORD_MISC_USER , -MAP__FUNCTION , ip, &al); +thread__find_symbol (thread,PERF_RECORD_MISC_USER , ip, &al); e.ip = al.addr; e.map = al.map;