diff options
Diffstat (limited to 'tools/perf/util/header.c')
| -rw-r--r-- | tools/perf/util/header.c | 48 | 
1 files changed, 41 insertions, 7 deletions
| diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 2dd5edf161b7..e909d43cf542 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -1942,7 +1942,6 @@ int perf_file_header__read(struct perf_file_header *header,  		else  			return -1;  	} else if (ph->needs_swap) { -		unsigned int i;  		/*  		 * feature bitmap is declared as an array of unsigned longs --  		 * not good since its size can differ between the host that @@ -1958,14 +1957,17 @@ int perf_file_header__read(struct perf_file_header *header,  		 * file), punt and fallback to the original behavior --  		 * clearing all feature bits and setting buildid.  		 */ -		for (i = 0; i < BITS_TO_LONGS(HEADER_FEAT_BITS); ++i) -			header->adds_features[i] = bswap_64(header->adds_features[i]); +		mem_bswap_64(&header->adds_features, +			    BITS_TO_U64(HEADER_FEAT_BITS));  		if (!test_bit(HEADER_HOSTNAME, header->adds_features)) { -			for (i = 0; i < BITS_TO_LONGS(HEADER_FEAT_BITS); ++i) { -				header->adds_features[i] = bswap_64(header->adds_features[i]); -				header->adds_features[i] = bswap_32(header->adds_features[i]); -			} +			/* unswap as u64 */ +			mem_bswap_64(&header->adds_features, +				    BITS_TO_U64(HEADER_FEAT_BITS)); + +			/* unswap as u32 */ +			mem_bswap_32(&header->adds_features, +				    BITS_TO_U32(HEADER_FEAT_BITS));  		}  		if (!test_bit(HEADER_HOSTNAME, header->adds_features)) { @@ -2091,6 +2093,35 @@ static int read_attr(int fd, struct perf_header *ph,  	return ret <= 0 ? -1 : 0;  } +static int perf_evsel__set_tracepoint_name(struct perf_evsel *evsel) +{ +	struct event_format *event = trace_find_event(evsel->attr.config); +	char bf[128]; + +	if (event == NULL) +		return -1; + +	snprintf(bf, sizeof(bf), "%s:%s", event->system, event->name); +	evsel->name = strdup(bf); +	if (event->name == NULL) +		return -1; + +	return 0; +} + +static int perf_evlist__set_tracepoint_names(struct perf_evlist *evlist) +{ +	struct perf_evsel *pos; + +	list_for_each_entry(pos, &evlist->entries, node) { +		if (pos->attr.type == PERF_TYPE_TRACEPOINT && +		    perf_evsel__set_tracepoint_name(pos)) +			return -1; +	} + +	return 0; +} +  int perf_session__read_header(struct perf_session *session, int fd)  {  	struct perf_header *header = &session->header; @@ -2172,6 +2203,9 @@ int perf_session__read_header(struct perf_session *session, int fd)  	lseek(fd, header->data_offset, SEEK_SET); +	if (perf_evlist__set_tracepoint_names(session->evlist)) +		goto out_delete_evlist; +  	header->frozen = 1;  	return 0;  out_errno: | 
