perf symbols: Kill struct build_id_list and die() another day
No need for this struct and its allocations, we can just use the ->build_id member we already have in struct dso, then ask for it to be read, and later traverse the dsos list, writing the buildid table to the perf.data file. As a bonus, one more die() function got killed. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Frédéric Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Paul Mackerras <paulus@samba.org> LKML-Reference: <1258582853-8579-2-git-send-email-acme@infradead.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
		
					parent
					
						
							
								d3379ab905
							
						
					
				
			
			
				commit
				
					
						e30a3d12dd
					
				
			
		
					 4 changed files with 26 additions and 47 deletions
				
			
		| 
						 | 
					@ -69,13 +69,6 @@ struct build_id_event {
 | 
				
			||||||
	char			 filename[];
 | 
						char			 filename[];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct build_id_list {
 | 
					 | 
				
			||||||
	struct build_id_event	event;
 | 
					 | 
				
			||||||
	struct list_head	list;
 | 
					 | 
				
			||||||
	const char		*dso_name;
 | 
					 | 
				
			||||||
	int			len;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef union event_union {
 | 
					typedef union event_union {
 | 
				
			||||||
	struct perf_event_header	header;
 | 
						struct perf_event_header	header;
 | 
				
			||||||
	struct ip_event			ip;
 | 
						struct ip_event			ip;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -176,18 +176,24 @@ static int do_write(int fd, const void *buf, size_t size)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int write_buildid_table(int fd, struct list_head *id_head)
 | 
					static int dsos__write_buildid_table(int fd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct build_id_list *iter, *next;
 | 
						struct dso *pos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	list_for_each_entry_safe(iter, next, id_head, list) {
 | 
						list_for_each_entry(pos, &dsos, node) {
 | 
				
			||||||
		struct build_id_event *b = &iter->event;
 | 
							struct build_id_event b;
 | 
				
			||||||
 | 
							size_t len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (do_write(fd, b, sizeof(*b)) < 0 ||
 | 
							if (!pos->has_build_id)
 | 
				
			||||||
		    do_write(fd, iter->dso_name, iter->len) < 0)
 | 
								continue;
 | 
				
			||||||
 | 
							len = pos->long_name_len + 1;
 | 
				
			||||||
 | 
							len = ALIGN(len, 64);
 | 
				
			||||||
 | 
							memset(&b, 0, sizeof(b));
 | 
				
			||||||
 | 
							memcpy(&b.build_id, pos->build_id, sizeof(pos->build_id));
 | 
				
			||||||
 | 
							b.header.size = sizeof(b) + len;
 | 
				
			||||||
 | 
							if (do_write(fd, &b, sizeof(b)) < 0 ||
 | 
				
			||||||
 | 
							    do_write(fd, pos->long_name, len) < 0)
 | 
				
			||||||
			return -1;
 | 
								return -1;
 | 
				
			||||||
		list_del(&iter->list);
 | 
					 | 
				
			||||||
		free(iter);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
| 
						 | 
					@ -196,14 +202,13 @@ static int write_buildid_table(int fd, struct list_head *id_head)
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
perf_header__adds_write(struct perf_header *self, int fd)
 | 
					perf_header__adds_write(struct perf_header *self, int fd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	LIST_HEAD(id_list);
 | 
					 | 
				
			||||||
	int nr_sections;
 | 
						int nr_sections;
 | 
				
			||||||
	struct perf_file_section *feat_sec;
 | 
						struct perf_file_section *feat_sec;
 | 
				
			||||||
	int sec_size;
 | 
						int sec_size;
 | 
				
			||||||
	u64 sec_start;
 | 
						u64 sec_start;
 | 
				
			||||||
	int idx = 0;
 | 
						int idx = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (fetch_build_id_table(&id_list))
 | 
						if (dsos__read_build_ids())
 | 
				
			||||||
		perf_header__set_feat(self, HEADER_BUILD_ID);
 | 
							perf_header__set_feat(self, HEADER_BUILD_ID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	nr_sections = bitmap_weight(self->adds_features, HEADER_FEAT_BITS);
 | 
						nr_sections = bitmap_weight(self->adds_features, HEADER_FEAT_BITS);
 | 
				
			||||||
| 
						 | 
					@ -238,7 +243,7 @@ perf_header__adds_write(struct perf_header *self, int fd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Write build-ids */
 | 
							/* Write build-ids */
 | 
				
			||||||
		buildid_sec->offset = lseek(fd, 0, SEEK_CUR);
 | 
							buildid_sec->offset = lseek(fd, 0, SEEK_CUR);
 | 
				
			||||||
		if (write_buildid_table(fd, &id_list) < 0)
 | 
							if (dsos__write_buildid_table(fd) < 0)
 | 
				
			||||||
			die("failed to write buildid table");
 | 
								die("failed to write buildid table");
 | 
				
			||||||
		buildid_sec->size = lseek(fd, 0, SEEK_CUR) - buildid_sec->offset;
 | 
							buildid_sec->size = lseek(fd, 0, SEEK_CUR) - buildid_sec->offset;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -883,38 +883,19 @@ out_close:
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool fetch_build_id_table(struct list_head *head)
 | 
					bool dsos__read_build_ids(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	bool have_buildid = false;
 | 
						bool have_build_id = false;
 | 
				
			||||||
	struct dso *pos;
 | 
						struct dso *pos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	list_for_each_entry(pos, &dsos, node) {
 | 
						list_for_each_entry(pos, &dsos, node)
 | 
				
			||||||
		struct build_id_list *new;
 | 
							if (filename__read_build_id(pos->long_name, pos->build_id,
 | 
				
			||||||
		struct build_id_event b;
 | 
										    sizeof(pos->build_id)) > 0) {
 | 
				
			||||||
		size_t len;
 | 
								have_build_id	  = true;
 | 
				
			||||||
 | 
								pos->has_build_id = true;
 | 
				
			||||||
		if (filename__read_build_id(pos->long_name,
 | 
					 | 
				
			||||||
					    &b.build_id,
 | 
					 | 
				
			||||||
					    sizeof(b.build_id)) < 0)
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
		have_buildid = true;
 | 
					 | 
				
			||||||
		memset(&b.header, 0, sizeof(b.header));
 | 
					 | 
				
			||||||
		len = pos->long_name_len + 1;
 | 
					 | 
				
			||||||
		len = ALIGN(len, 64);
 | 
					 | 
				
			||||||
		b.header.size = sizeof(b) + len;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		new = malloc(sizeof(*new));
 | 
					 | 
				
			||||||
		if (!new)
 | 
					 | 
				
			||||||
			die("No memory\n");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		memcpy(&new->event, &b, sizeof(b));
 | 
					 | 
				
			||||||
		new->dso_name = pos->long_name;
 | 
					 | 
				
			||||||
		new->len = len;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		list_add_tail(&new->list, head);
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return have_buildid;
 | 
						return have_build_id;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int filename__read_build_id(const char *filename, void *bf, size_t size)
 | 
					int filename__read_build_id(const char *filename, void *bf, size_t size)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -89,7 +89,7 @@ char dso__symtab_origin(const struct dso *self);
 | 
				
			||||||
void dso__set_build_id(struct dso *self, void *build_id);
 | 
					void dso__set_build_id(struct dso *self, void *build_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int filename__read_build_id(const char *filename, void *bf, size_t size);
 | 
					int filename__read_build_id(const char *filename, void *bf, size_t size);
 | 
				
			||||||
bool fetch_build_id_table(struct list_head *head);
 | 
					bool dsos__read_build_ids(void);
 | 
				
			||||||
int build_id__sprintf(u8 *self, int len, char *bf);
 | 
					int build_id__sprintf(u8 *self, int len, char *bf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int load_kernel(symbol_filter_t filter);
 | 
					int load_kernel(symbol_filter_t filter);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue