diff options
Diffstat (limited to 'tools/perf/util/event.c')
| -rw-r--r-- | tools/perf/util/event.c | 73 | 
1 files changed, 44 insertions, 29 deletions
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 98ff3a6a3d50..0c8ecf0c78a4 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -88,10 +88,10 @@ static const char *perf_ns__name(unsigned int id)  	return perf_ns__names[id];  } -static int perf_tool__process_synth_event(struct perf_tool *tool, -					  union perf_event *event, -					  struct machine *machine, -					  perf_event__handler_t process) +int perf_tool__process_synth_event(struct perf_tool *tool, +				   union perf_event *event, +				   struct machine *machine, +				   perf_event__handler_t process)  {  	struct perf_sample synth_sample = {  	.pid	   = -1, @@ -464,8 +464,7 @@ int perf_event__synthesize_modules(struct perf_tool *tool,  {  	int rc = 0;  	struct map *pos; -	struct map_groups *kmaps = &machine->kmaps; -	struct maps *maps = &kmaps->maps[MAP__FUNCTION]; +	struct maps *maps = machine__kernel_maps(machine);  	union perf_event *event = zalloc((sizeof(event->mmap) +  					  machine->id_hdr_size));  	if (event == NULL) { @@ -488,7 +487,7 @@ int perf_event__synthesize_modules(struct perf_tool *tool,  	for (pos = maps__first(maps); pos; pos = map__next(pos)) {  		size_t size; -		if (__map__is_kernel(pos)) +		if (!__map__is_kmodule(pos))  			continue;  		size = PERF_ALIGN(pos->dso->long_name_len + 1, sizeof(u64)); @@ -869,7 +868,7 @@ static int find_symbol_cb(void *arg, const char *name, char type,  	 * Must be a function or at least an alias, as in PARISC64, where "_text" is  	 * an 'A' to the same address as "_stext".  	 */ -	if (!(symbol_type__is_a(type, MAP__FUNCTION) || +	if (!(kallsyms__is_function(type) ||  	      type == 'A') || strcmp(name, args->name))  		return 0; @@ -889,9 +888,16 @@ int kallsyms__get_function_start(const char *kallsyms_filename,  	return 0;  } -int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, -				       perf_event__handler_t process, -				       struct machine *machine) +int __weak perf_event__synthesize_extra_kmaps(struct perf_tool *tool __maybe_unused, +					      perf_event__handler_t process __maybe_unused, +					      struct machine *machine __maybe_unused) +{ +	return 0; +} + +static int __perf_event__synthesize_kernel_mmap(struct perf_tool *tool, +						perf_event__handler_t process, +						struct machine *machine)  {  	size_t size;  	struct map *map = machine__kernel_map(machine); @@ -944,6 +950,19 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,  	return err;  } +int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, +				       perf_event__handler_t process, +				       struct machine *machine) +{ +	int err; + +	err = __perf_event__synthesize_kernel_mmap(tool, process, machine); +	if (err < 0) +		return err; + +	return perf_event__synthesize_extra_kmaps(tool, process, machine); +} +  int perf_event__synthesize_thread_map2(struct perf_tool *tool,  				      struct thread_map *threads,  				      perf_event__handler_t process, @@ -1489,9 +1508,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) +struct map *thread__find_map(struct thread *thread, u8 cpumode, u64 addr, +			     struct addr_location *al)  {  	struct map_groups *mg = thread->mg;  	struct machine *machine = mg->machine; @@ -1505,7 +1523,7 @@ void thread__find_addr_map(struct thread *thread, u8 cpumode,  	if (machine == NULL) {  		al->map = NULL; -		return; +		return NULL;  	}  	if (cpumode == PERF_RECORD_MISC_KERNEL && perf_host) { @@ -1533,10 +1551,10 @@ void thread__find_addr_map(struct thread *thread, u8 cpumode,  			!perf_host)  			al->filtered |= (1 << HIST_FILTER__HOST); -		return; +		return NULL;  	}  try_again: -	al->map = map_groups__find(mg, type, al->addr); +	al->map = map_groups__find(mg, al->addr);  	if (al->map == NULL) {  		/*  		 * If this is outside of all known maps, and is a negative @@ -1563,17 +1581,17 @@ try_again:  			map__load(al->map);  		al->addr = al->map->map_ip(al->map, al->addr);  	} + +	return al->map;  } -void thread__find_addr_location(struct thread *thread, -				u8 cpumode, enum map_type type, u64 addr, -				struct addr_location *al) +struct symbol *thread__find_symbol(struct thread *thread, u8 cpumode, +				   u64 addr, struct addr_location *al)  { -	thread__find_addr_map(thread, cpumode, type, addr, al); -	if (al->map != NULL) +	al->sym = NULL; +	if (thread__find_map(thread, cpumode, addr, al))  		al->sym = map__find_symbol(al->map, al->addr); -	else -		al->sym = NULL; +	return al->sym;  }  /* @@ -1590,7 +1608,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 +1687,7 @@ 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);  	al->cpu = sample->cpu;  	al->sym = NULL;  | 
