perf symbols: Encapsulate dsos list head into struct dsos
This is a precursor patch to enable long name searching of DSOs using a rbtree. In this patch, a new dsos structure is created which contains only a list head structure for the moment. The new dsos structure is used, in turn, in the machine structure for the user_dsos and kernel_dsos fields. Only the following 3 dsos functions are modified to accept the new dsos structure parameter instead of list_head: - dsos__add() - dsos__find() - __dsos__findnew() Signed-off-by: Waiman Long <Waiman.Long@hp.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Don Zickus <dzickus@redhat.com> Cc: Douglas Hatch <doug.hatch@hp.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Scott J Norton <scott.norton@hp.com> Link: http://lkml.kernel.org/r/1412021249-19201-2-git-send-email-Waiman.Long@hp.com [ Move struct dsos to dso.h to reduce the dso methods depends on machine.h ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
							parent
							
								
									e19685ed24
								
							
						
					
					
						commit
						8fa7d87f91
					
				| @ -851,35 +851,36 @@ bool __dsos__read_build_ids(struct list_head *head, bool with_hits) | ||||
| 	return have_build_id; | ||||
| } | ||||
| 
 | ||||
| void dsos__add(struct list_head *head, struct dso *dso) | ||||
| void dsos__add(struct dsos *dsos, struct dso *dso) | ||||
| { | ||||
| 	list_add_tail(&dso->node, head); | ||||
| 	list_add_tail(&dso->node, &dsos->head); | ||||
| } | ||||
| 
 | ||||
| struct dso *dsos__find(const struct list_head *head, const char *name, bool cmp_short) | ||||
| struct dso *dsos__find(const struct dsos *dsos, const char *name, | ||||
| 		       bool cmp_short) | ||||
| { | ||||
| 	struct dso *pos; | ||||
| 
 | ||||
| 	if (cmp_short) { | ||||
| 		list_for_each_entry(pos, head, node) | ||||
| 		list_for_each_entry(pos, &dsos->head, node) | ||||
| 			if (strcmp(pos->short_name, name) == 0) | ||||
| 				return pos; | ||||
| 		return NULL; | ||||
| 	} | ||||
| 	list_for_each_entry(pos, head, node) | ||||
| 	list_for_each_entry(pos, &dsos->head, node) | ||||
| 		if (strcmp(pos->long_name, name) == 0) | ||||
| 			return pos; | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| struct dso *__dsos__findnew(struct list_head *head, const char *name) | ||||
| struct dso *__dsos__findnew(struct dsos *dsos, const char *name) | ||||
| { | ||||
| 	struct dso *dso = dsos__find(head, name, false); | ||||
| 	struct dso *dso = dsos__find(dsos, name, false); | ||||
| 
 | ||||
| 	if (!dso) { | ||||
| 		dso = dso__new(name); | ||||
| 		if (dso != NULL) { | ||||
| 			dsos__add(head, dso); | ||||
| 			dsos__add(dsos, dso); | ||||
| 			dso__set_basename(dso); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @ -90,6 +90,13 @@ struct dso_cache { | ||||
| 	char data[0]; | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * DSOs are put into a list for fast iteration. | ||||
|  */ | ||||
| struct dsos { | ||||
| 	struct list_head head; | ||||
| }; | ||||
| 
 | ||||
| struct dso { | ||||
| 	struct list_head node; | ||||
| 	struct rb_root	 symbols[MAP__NR_TYPES]; | ||||
| @ -224,10 +231,10 @@ struct map *dso__new_map(const char *name); | ||||
| struct dso *dso__kernel_findnew(struct machine *machine, const char *name, | ||||
| 				const char *short_name, int dso_type); | ||||
| 
 | ||||
| void dsos__add(struct list_head *head, struct dso *dso); | ||||
| struct dso *dsos__find(const struct list_head *head, const char *name, | ||||
| void dsos__add(struct dsos *dsos, struct dso *dso); | ||||
| struct dso *dsos__find(const struct dsos *dsos, const char *name, | ||||
| 		       bool cmp_short); | ||||
| struct dso *__dsos__findnew(struct list_head *head, const char *name); | ||||
| struct dso *__dsos__findnew(struct dsos *dsos, const char *name); | ||||
| bool __dsos__read_build_ids(struct list_head *head, bool with_hits); | ||||
| 
 | ||||
| size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp, | ||||
|  | ||||
| @ -214,11 +214,11 @@ static int machine__hit_all_dsos(struct machine *machine) | ||||
| { | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = __dsos__hit_all(&machine->kernel_dsos); | ||||
| 	err = __dsos__hit_all(&machine->kernel_dsos.head); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	return __dsos__hit_all(&machine->user_dsos); | ||||
| 	return __dsos__hit_all(&machine->user_dsos.head); | ||||
| } | ||||
| 
 | ||||
| int dsos__hit_all(struct perf_session *session) | ||||
| @ -288,11 +288,12 @@ static int machine__write_buildid_table(struct machine *machine, int fd) | ||||
| 		umisc = PERF_RECORD_MISC_GUEST_USER; | ||||
| 	} | ||||
| 
 | ||||
| 	err = __dsos__write_buildid_table(&machine->kernel_dsos, machine, | ||||
| 	err = __dsos__write_buildid_table(&machine->kernel_dsos.head, machine, | ||||
| 					  machine->pid, kmisc, fd); | ||||
| 	if (err == 0) | ||||
| 		err = __dsos__write_buildid_table(&machine->user_dsos, machine, | ||||
| 						  machine->pid, umisc, fd); | ||||
| 		err = __dsos__write_buildid_table(&machine->user_dsos.head, | ||||
| 						  machine, machine->pid, umisc, | ||||
| 						  fd); | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
| @ -455,9 +456,10 @@ static int __dsos__cache_build_ids(struct list_head *head, | ||||
| 
 | ||||
| static int machine__cache_build_ids(struct machine *machine, const char *debugdir) | ||||
| { | ||||
| 	int ret = __dsos__cache_build_ids(&machine->kernel_dsos, machine, | ||||
| 	int ret = __dsos__cache_build_ids(&machine->kernel_dsos.head, machine, | ||||
| 					  debugdir); | ||||
| 	ret |= __dsos__cache_build_ids(&machine->user_dsos, machine, debugdir); | ||||
| 	ret |= __dsos__cache_build_ids(&machine->user_dsos.head, machine, | ||||
| 				       debugdir); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| @ -483,8 +485,10 @@ static int perf_session__cache_build_ids(struct perf_session *session) | ||||
| 
 | ||||
| static bool machine__read_build_ids(struct machine *machine, bool with_hits) | ||||
| { | ||||
| 	bool ret = __dsos__read_build_ids(&machine->kernel_dsos, with_hits); | ||||
| 	ret |= __dsos__read_build_ids(&machine->user_dsos, with_hits); | ||||
| 	bool ret; | ||||
| 
 | ||||
| 	ret  = __dsos__read_build_ids(&machine->kernel_dsos.head, with_hits); | ||||
| 	ret |= __dsos__read_build_ids(&machine->user_dsos.head, with_hits); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| @ -1548,7 +1552,7 @@ static int __event_process_build_id(struct build_id_event *bev, | ||||
| 				    struct perf_session *session) | ||||
| { | ||||
| 	int err = -1; | ||||
| 	struct list_head *head; | ||||
| 	struct dsos *dsos; | ||||
| 	struct machine *machine; | ||||
| 	u16 misc; | ||||
| 	struct dso *dso; | ||||
| @ -1563,22 +1567,22 @@ static int __event_process_build_id(struct build_id_event *bev, | ||||
| 	switch (misc) { | ||||
| 	case PERF_RECORD_MISC_KERNEL: | ||||
| 		dso_type = DSO_TYPE_KERNEL; | ||||
| 		head = &machine->kernel_dsos; | ||||
| 		dsos = &machine->kernel_dsos; | ||||
| 		break; | ||||
| 	case PERF_RECORD_MISC_GUEST_KERNEL: | ||||
| 		dso_type = DSO_TYPE_GUEST_KERNEL; | ||||
| 		head = &machine->kernel_dsos; | ||||
| 		dsos = &machine->kernel_dsos; | ||||
| 		break; | ||||
| 	case PERF_RECORD_MISC_USER: | ||||
| 	case PERF_RECORD_MISC_GUEST_USER: | ||||
| 		dso_type = DSO_TYPE_USER; | ||||
| 		head = &machine->user_dsos; | ||||
| 		dsos = &machine->user_dsos; | ||||
| 		break; | ||||
| 	default: | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	dso = __dsos__findnew(head, filename); | ||||
| 	dso = __dsos__findnew(dsos, filename); | ||||
| 	if (dso != NULL) { | ||||
| 		char sbuild_id[BUILD_ID_SIZE * 2 + 1]; | ||||
| 
 | ||||
|  | ||||
| @ -17,8 +17,8 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid) | ||||
| { | ||||
| 	map_groups__init(&machine->kmaps); | ||||
| 	RB_CLEAR_NODE(&machine->rb_node); | ||||
| 	INIT_LIST_HEAD(&machine->user_dsos); | ||||
| 	INIT_LIST_HEAD(&machine->kernel_dsos); | ||||
| 	INIT_LIST_HEAD(&machine->user_dsos.head); | ||||
| 	INIT_LIST_HEAD(&machine->kernel_dsos.head); | ||||
| 
 | ||||
| 	machine->threads = RB_ROOT; | ||||
| 	INIT_LIST_HEAD(&machine->dead_threads); | ||||
| @ -72,11 +72,11 @@ out_delete: | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| static void dsos__delete(struct list_head *dsos) | ||||
| static void dsos__delete(struct dsos *dsos) | ||||
| { | ||||
| 	struct dso *pos, *n; | ||||
| 
 | ||||
| 	list_for_each_entry_safe(pos, n, dsos, node) { | ||||
| 	list_for_each_entry_safe(pos, n, &dsos->head, node) { | ||||
| 		list_del(&pos->node); | ||||
| 		dso__delete(pos); | ||||
| 	} | ||||
| @ -477,23 +477,23 @@ struct map *machine__new_module(struct machine *machine, u64 start, | ||||
| size_t machines__fprintf_dsos(struct machines *machines, FILE *fp) | ||||
| { | ||||
| 	struct rb_node *nd; | ||||
| 	size_t ret = __dsos__fprintf(&machines->host.kernel_dsos, fp) + | ||||
| 		     __dsos__fprintf(&machines->host.user_dsos, fp); | ||||
| 	size_t ret = __dsos__fprintf(&machines->host.kernel_dsos.head, fp) + | ||||
| 		     __dsos__fprintf(&machines->host.user_dsos.head, fp); | ||||
| 
 | ||||
| 	for (nd = rb_first(&machines->guests); nd; nd = rb_next(nd)) { | ||||
| 		struct machine *pos = rb_entry(nd, struct machine, rb_node); | ||||
| 		ret += __dsos__fprintf(&pos->kernel_dsos, fp); | ||||
| 		ret += __dsos__fprintf(&pos->user_dsos, fp); | ||||
| 		ret += __dsos__fprintf(&pos->kernel_dsos.head, fp); | ||||
| 		ret += __dsos__fprintf(&pos->user_dsos.head, fp); | ||||
| 	} | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| size_t machine__fprintf_dsos_buildid(struct machine *machine, FILE *fp, | ||||
| size_t machine__fprintf_dsos_buildid(struct machine *m, FILE *fp, | ||||
| 				     bool (skip)(struct dso *dso, int parm), int parm) | ||||
| { | ||||
| 	return __dsos__fprintf_buildid(&machine->kernel_dsos, fp, skip, parm) + | ||||
| 	       __dsos__fprintf_buildid(&machine->user_dsos, fp, skip, parm); | ||||
| 	return __dsos__fprintf_buildid(&m->kernel_dsos.head, fp, skip, parm) + | ||||
| 	       __dsos__fprintf_buildid(&m->user_dsos.head, fp, skip, parm); | ||||
| } | ||||
| 
 | ||||
| size_t machines__fprintf_dsos_buildid(struct machines *machines, FILE *fp, | ||||
| @ -994,7 +994,7 @@ static bool machine__uses_kcore(struct machine *machine) | ||||
| { | ||||
| 	struct dso *dso; | ||||
| 
 | ||||
| 	list_for_each_entry(dso, &machine->kernel_dsos, node) { | ||||
| 	list_for_each_entry(dso, &machine->kernel_dsos.head, node) { | ||||
| 		if (dso__is_kcore(dso)) | ||||
| 			return true; | ||||
| 	} | ||||
|  | ||||
| @ -4,6 +4,7 @@ | ||||
| #include <sys/types.h> | ||||
| #include <linux/rbtree.h> | ||||
| #include "map.h" | ||||
| #include "dso.h" | ||||
| #include "event.h" | ||||
| 
 | ||||
| struct addr_location; | ||||
| @ -32,8 +33,8 @@ struct machine { | ||||
| 	struct list_head  dead_threads; | ||||
| 	struct thread	  *last_match; | ||||
| 	struct vdso_info  *vdso_info; | ||||
| 	struct list_head  user_dsos; | ||||
| 	struct list_head  kernel_dsos; | ||||
| 	struct dsos	  user_dsos; | ||||
| 	struct dsos	  kernel_dsos; | ||||
| 	struct map_groups kmaps; | ||||
| 	struct map	  *vmlinux_maps[MAP__NR_TYPES]; | ||||
| 	u64		  kernel_start; | ||||
|  | ||||
| @ -184,7 +184,8 @@ static struct dso *kernel_get_module_dso(const char *module) | ||||
| 	const char *vmlinux_name; | ||||
| 
 | ||||
| 	if (module) { | ||||
| 		list_for_each_entry(dso, &host_machine->kernel_dsos, node) { | ||||
| 		list_for_each_entry(dso, &host_machine->kernel_dsos.head, | ||||
| 				    node) { | ||||
| 			if (strncmp(dso->short_name + 1, module, | ||||
| 				    dso->short_name_len - 2) == 0) | ||||
| 				goto found; | ||||
|  | ||||
| @ -6,6 +6,7 @@ | ||||
| #include <inttypes.h> | ||||
| 
 | ||||
| #include "symbol.h" | ||||
| #include "machine.h" | ||||
| #include "vdso.h" | ||||
| #include <symbol/kallsyms.h> | ||||
| #include "debug.h" | ||||
| @ -929,7 +930,11 @@ int dso__load_sym(struct dso *dso, struct map *map, | ||||
| 				} | ||||
| 				curr_dso->symtab_type = dso->symtab_type; | ||||
| 				map_groups__insert(kmap->kmaps, curr_map); | ||||
| 				dsos__add(&dso->node, curr_dso); | ||||
| 				/*
 | ||||
| 				 * The new DSO should go to the kernel DSOS | ||||
| 				 */ | ||||
| 				dsos__add(&map->groups->machine->kernel_dsos, | ||||
| 					  curr_dso); | ||||
| 				dso__set_loaded(curr_dso, map->type); | ||||
| 			} else | ||||
| 				curr_dso = curr_map->dso; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user