perf thread: Introduce thread__find_map()
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: f07a2d32b521a54635c8efeb0a3180b0afcf780a Gitweb: https://git.kernel.org/tip/f07a2d32b521a54635c8efeb0a3180b0afcf780a Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Tue, 24 Apr 2018 10:49:50 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 26 Apr 2018 13:47:06 -0300
perf thread: Introduce thread__find_map()
Out of thread__find_add_map(..., 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_map() 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/builtin-inject.c | 2 +- tools/perf/builtin-script.c | 19 +++++++++---------- tools/perf/tests/code-reading.c | 4 ++-- tools/perf/tests/mmap-thread-lookup.c | 7 +++---- tools/perf/util/build-id.c | 2 +- tools/perf/util/cs-etm.c | 2 +- tools/perf/util/event.c | 18 +++++++++--------- tools/perf/util/intel-bts.c | 2 +- tools/perf/util/intel-pt.c | 4 ++-- tools/perf/util/thread.h | 11 ++++++++--- tools/perf/util/unwind-libdw.c | 7 +++---- tools/perf/util/unwind-libunwind-local.c | 7 +++---- 12 files changed, 43 insertions(+), 42 deletions(-)
tools/perf/builtin-inject.c +1 -1
@@ -440,7 +440,7 @@ static int perf_event__inject_buildid(struct perf_tool *tool, goto repipe; } -thread__find_addr_map (thread, sample->cpumode,MAP__FUNCTION , sample->ip, &al); +thread__find_map (thread, sample->cpumode, sample->ip, &al);if (al.map !=NULL ) {if (!al.map->dso->hit) {
tools/perf/builtin-script.c +9 -10
@@ -717,8 +717,8 @@ static int perf_sample__fprintf_brstack(struct perf_sample *sample,if (PRINT_FIELD (DSO )) {memset (&alf,0 ,sizeof (alf));memset (&alt,0 ,sizeof (alt)); -thread__find_addr_map (thread, sample->cpumode,MAP__FUNCTION , from, &alf); -thread__find_addr_map (thread, sample->cpumode,MAP__FUNCTION , to, &alt); +thread__find_map (thread, sample->cpumode, from, &alf); +thread__find_map (thread, sample->cpumode, to, &alt); } printed +=fprintf (fp," 0x%" PRIx64, from);
@@ -764,11 +764,11 @@ static int perf_sample__fprintf_brstacksym(struct perf_sample *sample, from = br->entries[i].from; to = br->entries[i].to; -thread__find_addr_map (thread, sample->cpumode,MAP__FUNCTION , from, &alf); +thread__find_map (thread, sample->cpumode, from, &alf);if (alf.map) alf.sym =map__find_symbol (alf.map, alf.addr); -thread__find_addr_map (thread, sample->cpumode,MAP__FUNCTION , to, &alt); +thread__find_map (thread, sample->cpumode, to, &alt);if (alt.map) alt.sym =map__find_symbol (alt.map, alt.addr);
@@ -814,11 +814,11 @@ static int perf_sample__fprintf_brstackoff(struct perf_sample *sample, from = br->entries[i].from; to = br->entries[i].to; -thread__find_addr_map (thread, sample->cpumode,MAP__FUNCTION , from, &alf); +thread__find_map (thread, sample->cpumode, from, &alf);if (alf.map && !alf.map->dso->adjust_symbols) from =map__map_ip (alf.map, from); -thread__find_addr_map (thread, sample->cpumode,MAP__FUNCTION , to, &alt); +thread__find_map (thread, sample->cpumode, to, &alt);if (alt.map && !alt.map->dso->adjust_symbols) to =map__map_ip (alt.map, to);
@@ -882,7 +882,7 @@ static int grab_bb(u8 *buffer, u64 start, u64 end,return 0 ; } -thread__find_addr_map (thread, *cpumode,MAP__FUNCTION , start, &al); +thread__find_map (thread, *cpumode, start, &al);if (!al.map || !al.map->dso) {pr_debug ("\tcannot resolve %" PRIx64"-%" PRIx64"\n" , start, end);return 0 ;
@@ -933,10 +933,9 @@ static int ip__fprintf_sym(uint64_t addr, struct thread *thread,memset (&al,0 ,sizeof (al)); -thread__find_addr_map (thread, cpumode,MAP__FUNCTION , addr, &al); +thread__find_map (thread, cpumode, addr, &al);if (!al.map) -thread__find_addr_map (thread, cpumode,MAP__VARIABLE , - addr, &al); +__thread__find_map (thread, cpumode,MAP__VARIABLE , addr, &al);if ((*lastsym) && al.addr >= (*lastsym)->start && al.addr < (*lastsym)->end)return 0 ;
tools/perf/tests/code-reading.c +2 -2
@@ -236,14 +236,14 @@ static int read_object_code(u64 addr, size_t len, u8 cpumode,pr_debug ("Reading object code for memory address: %#" PRIx64"\n" , addr); -thread__find_addr_map (thread, cpumode,MAP__FUNCTION , addr, &al); +thread__find_map (thread, cpumode, addr, &al);if (!al.map || !al.map->dso) {if (cpumode ==PERF_RECORD_MISC_HYPERVISOR ) {pr_debug ("Hypervisor address can not be resolved - skipping\n" );return 0 ; } -pr_debug ("thread__find_addr_map failed\n" ); +pr_debug ("thread__find_map failed\n" );return -1 ; }
tools/perf/tests/mmap-thread-lookup.c +3 -4
@@ -188,9 +188,8 @@ static int mmap_events(synth_cb synth)pr_debug ("looking for map %p\n" , td->map); -thread__find_addr_map (thread, -PERF_RECORD_MISC_USER ,MAP__FUNCTION , - (unsigned long ) (td->map +1 ), &al); +thread__find_map (thread,PERF_RECORD_MISC_USER , + (unsigned long ) (td->map +1 ), &al);thread__put (thread);
@@ -218,7 +217,7 @@ static int mmap_events(synth_cb synth)* perf_event__synthesize_threads (global) * * We test we can find all memory maps via: -* thread__find_addr_map +* thread__find_map * * by using all thread objects. */
tools/perf/util/build-id.c +1 -1
@@ -47,7 +47,7 @@ int build_id__mark_dso_hit(struct perf_tool *tool __maybe_unused,return -1 ; } -thread__find_addr_map (thread, sample->cpumode,MAP__FUNCTION , sample->ip, &al); +thread__find_map (thread, sample->cpumode, sample->ip, &al);if (al.map !=NULL ) al.map->dso->hit =1 ;
tools/perf/util/cs-etm.c +1 -1
@@ -269,7 +269,7 @@ static u32 cs_etm__mem_access(struct cs_etm_queue *etmq, u64 address, thread = etmq->etm->unknown_thread; } -thread__find_addr_map (thread, cpumode,MAP__FUNCTION , address, &al); +thread__find_map (thread, cpumode, address, &al);if (!al.map || !al.map->dso)return 0 ;
tools/perf/util/event.c +9 -9
@@ -1489,9 +1489,8 @@ int perf_event__process(struct perf_tool *tool __maybe_unused,return machine__process_event (machine, event, sample); } -void thread__find_addr_map (struct thread *thread,u8 cpumode, -enum map_type type,u64 addr, -struct addr_location *al) +void __thread__find_map (struct thread *thread,u8 cpumode,enum map_type type, +u64 addr,struct addr_location *al) {struct map_groups *mg = thread->mg;struct machine *machine = mg->machine;
@@ -1569,7 +1568,7 @@ void thread__find_addr_location(struct thread *thread, u8 cpumode, enum map_type type, u64 addr, struct addr_location *al) { -thread__find_addr_map (thread ,cpumode ,type ,addr ,al ); +__thread__find_map (thread ,cpumode ,type ,addr ,al );if (al->map !=NULL ) al->sym =map__find_symbol (al->map, al->addr);else
@@ -1590,7 +1589,7 @@ int machine__resolve(struct machine *machine, struct addr_location *al,return -1 ;dump_printf (" ... thread: %s:%d\n" ,thread__comm_str (thread), thread->tid); -thread__find_addr_map (thread, sample->cpumode,MAP__FUNCTION , sample->ip, al); +thread__find_map (thread, sample->cpumode, sample->ip, al);dump_printf (" ...... dso: %s\n" , al->map ? al->map->dso->long_name : al->level =='H' ?"[hypervisor]" :"<not found>" );
@@ -1669,10 +1668,11 @@ bool sample_addr_correlates_sym(struct perf_event_attr *attr)void thread__resolve (struct thread *thread,struct addr_location *al,struct perf_sample *sample) { -thread__find_addr_map (thread, sample->cpumode,MAP__FUNCTION , sample->addr, al); -if (!al->map) -thread__find_addr_map (thread, sample->cpumode,MAP__VARIABLE , - sample->addr, al); +thread__find_map (thread, sample->cpumode, sample->addr, al); +if (!al->map) { +__thread__find_map (thread, sample->cpumode,MAP__VARIABLE , + sample->addr, al); + } al->cpu = sample->cpu; al->sym =NULL ;
tools/perf/util/intel-bts.c +1 -1
@@ -335,7 +335,7 @@ static int intel_bts_get_next_insn(struct intel_bts_queue *btsq, u64 ip)if (!thread)return -1 ; -thread__find_addr_map (thread, cpumode,MAP__FUNCTION , ip, &al); +thread__find_map (thread, cpumode, ip, &al);if (!al.map || !al.map->dso) goto out_put;
tools/perf/util/intel-pt.c +2 -2
@@ -442,7 +442,7 @@ static int intel_pt_walk_next_insn(struct intel_pt_insn *intel_pt_insn, }while (1 ) { -thread__find_addr_map (thread, cpumode,MAP__FUNCTION , *ip, &al); +thread__find_map (thread, cpumode, *ip, &al);if (!al.map || !al.map->dso)return -EINVAL ;
@@ -596,7 +596,7 @@ static int __intel_pt_pgd_ip(uint64_t ip, void *data)if (!thread)return -EINVAL ; -thread__find_addr_map (thread, cpumode,MAP__FUNCTION , ip, &al); +thread__find_map (thread, cpumode, ip, &al);if (!al.map || !al.map->dso)return -EINVAL ;
tools/perf/util/thread.h +8 -3
@@ -92,9 +92,14 @@ size_t thread__fprintf(struct thread *thread, FILE *fp);struct thread *thread__main_thread (struct machine *machine,struct thread *thread); -void thread__find_addr_map (struct thread *thread, -u8 cpumode,enum map_type type,u64 addr, -struct addr_location *al); +void __thread__find_map (struct thread *thread,u8 cpumode,enum map_type type, +u64 addr,struct addr_location *al); + +static inline void thread__find_map (struct thread *thread,u8 cpumode, +u64 addr,struct addr_location *al) +{ +__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,
tools/perf/util/unwind-libdw.c +3 -4
@@ -103,16 +103,15 @@ static int access_dso_mem(struct unwind_info *ui, Dwarf_Addr addr,struct addr_location al;ssize_t size; -thread__find_addr_map (ui->thread,PERF_RECORD_MISC_USER , -MAP__FUNCTION , addr, &al); +thread__find_map (ui->thread,PERF_RECORD_MISC_USER , addr, &al);if (!al.map) {/* * We've seen cases (softice) where DWARF unwinder went * through non executable mmaps, which we need to lookup * in MAP__VARIABLE tree. */ -thread__find_addr_map (ui->thread,PERF_RECORD_MISC_USER , -MAP__VARIABLE , addr, &al); +__thread__find_map (ui->thread,PERF_RECORD_MISC_USER , +MAP__VARIABLE , addr, &al); }if (!al.map) {
tools/perf/util/unwind-libunwind-local.c +3 -4
@@ -367,16 +367,15 @@ static struct map *find_map(unw_word_t ip, struct unwind_info *ui) {struct addr_location al; -thread__find_addr_map (ui->thread,PERF_RECORD_MISC_USER , -MAP__FUNCTION , ip, &al); +thread__find_map (ui->thread,PERF_RECORD_MISC_USER , ip, &al);if (!al.map) {/* * We've seen cases (softice) where DWARF unwinder went * through non executable mmaps, which we need to lookup * in MAP__VARIABLE tree. */ -thread__find_addr_map (ui->thread,PERF_RECORD_MISC_USER , -MAP__VARIABLE , ip, &al); +__thread__find_map (ui->thread,PERF_RECORD_MISC_USER , +MAP__VARIABLE , ip, &al); }return al.map; }