diff options
Diffstat (limited to 'tools/perf/util/map.c')
| -rw-r--r-- | tools/perf/util/map.c | 64 | 
1 files changed, 51 insertions, 13 deletions
diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c index 35ae56864e4f..cc33486ad9e2 100644 --- a/tools/perf/util/map.c +++ b/tools/perf/util/map.c @@ -7,6 +7,8 @@  #include <stdio.h>  #include <unistd.h>  #include "map.h" +#include "thread.h" +#include "strlist.h"  const char *map_type__name[MAP__NR_TYPES] = {  	[MAP__FUNCTION] = "Functions", @@ -585,7 +587,21 @@ int machine__init(struct machine *self, const char *root_dir, pid_t pid)  	self->kmaps.machine = self;  	self->pid	    = pid;  	self->root_dir      = strdup(root_dir); -	return self->root_dir == NULL ? -ENOMEM : 0; +	if (self->root_dir == NULL) +		return -ENOMEM; + +	if (pid != HOST_KERNEL_ID) { +		struct thread *thread = machine__findnew_thread(self, pid); +		char comm[64]; + +		if (thread == NULL) +			return -ENOMEM; + +		snprintf(comm, sizeof(comm), "[guest/%d]", pid); +		thread__set_comm(thread, comm); +	} + +	return 0;  }  static void dsos__delete(struct list_head *self) @@ -669,25 +685,34 @@ struct machine *machines__find(struct rb_root *self, pid_t pid)  struct machine *machines__findnew(struct rb_root *self, pid_t pid)  {  	char path[PATH_MAX]; -	const char *root_dir; +	const char *root_dir = "";  	struct machine *machine = machines__find(self, pid); -	if (!machine || machine->pid != pid) { -		if (pid == HOST_KERNEL_ID || pid == DEFAULT_GUEST_KERNEL_ID) -			root_dir = ""; -		else { -			if (!symbol_conf.guestmount) -				goto out; -			sprintf(path, "%s/%d", symbol_conf.guestmount, pid); -			if (access(path, R_OK)) { +	if (machine && (machine->pid == pid)) +		goto out; + +	if ((pid != HOST_KERNEL_ID) && +	    (pid != DEFAULT_GUEST_KERNEL_ID) && +	    (symbol_conf.guestmount)) { +		sprintf(path, "%s/%d", symbol_conf.guestmount, pid); +		if (access(path, R_OK)) { +			static struct strlist *seen; + +			if (!seen) +				seen = strlist__new(true, NULL); + +			if (!strlist__has_entry(seen, path)) {  				pr_err("Can't access file %s\n", path); -				goto out; +				strlist__add(seen, path);  			} -			root_dir = path; +			machine = NULL; +			goto out;  		} -		machine = machines__add(self, pid, root_dir); +		root_dir = path;  	} +	machine = machines__add(self, pid, root_dir); +  out:  	return machine;  } @@ -713,3 +738,16 @@ char *machine__mmap_name(struct machine *self, char *bf, size_t size)  	return bf;  } + +void machines__set_id_hdr_size(struct rb_root *machines, u16 id_hdr_size) +{ +	struct rb_node *node; +	struct machine *machine; + +	for (node = rb_first(machines); node; node = rb_next(node)) { +		machine = rb_entry(node, struct machine, rb_node); +		machine->id_hdr_size = id_hdr_size; +	} + +	return; +}  | 
