diff options
| author | Ingo Molnar <mingo@kernel.org> | 2012-06-15 15:02:16 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2012-06-15 15:02:16 -0400 |
| commit | 8ed9eac4769407a8f0b93e381a3bc3ae81fa014b (patch) | |
| tree | 4a2d37876da0146b845dabca67c3390182881a09 | |
| parent | a70270468234749741c5893ae78e5bb524771402 (diff) | |
| parent | cb9dd49e11f83d548c822d7022ac180b0518b25c (diff) | |
Merge tag 'perf-urgent-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent
Pull perf fixes from Arnaldo Carvalho de Melo:
* Set name of tracepoints when reading the perf.data headers, so that
we don't end up using the local ones, from /sys.
* Fix default output file for perf stat, from Stephane Eranian.
* Fix endian handling of features bitmask in perf.data header, from David Ahern.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
| -rw-r--r-- | tools/perf/builtin-stat.c | 8 | ||||
| -rw-r--r-- | tools/perf/util/header.c | 48 | ||||
| -rw-r--r-- | tools/perf/util/include/linux/bitops.h | 2 | ||||
| -rw-r--r-- | tools/perf/util/session.c | 10 | ||||
| -rw-r--r-- | tools/perf/util/session.h | 1 |
5 files changed, 61 insertions, 8 deletions
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 262589991ea4..07b5c7703dd1 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
| @@ -1179,6 +1179,12 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) | |||
| 1179 | fprintf(stderr, "cannot use both --output and --log-fd\n"); | 1179 | fprintf(stderr, "cannot use both --output and --log-fd\n"); |
| 1180 | usage_with_options(stat_usage, options); | 1180 | usage_with_options(stat_usage, options); |
| 1181 | } | 1181 | } |
| 1182 | |||
| 1183 | if (output_fd < 0) { | ||
| 1184 | fprintf(stderr, "argument to --log-fd must be a > 0\n"); | ||
| 1185 | usage_with_options(stat_usage, options); | ||
| 1186 | } | ||
| 1187 | |||
| 1182 | if (!output) { | 1188 | if (!output) { |
| 1183 | struct timespec tm; | 1189 | struct timespec tm; |
| 1184 | mode = append_file ? "a" : "w"; | 1190 | mode = append_file ? "a" : "w"; |
| @@ -1190,7 +1196,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) | |||
| 1190 | } | 1196 | } |
| 1191 | clock_gettime(CLOCK_REALTIME, &tm); | 1197 | clock_gettime(CLOCK_REALTIME, &tm); |
| 1192 | fprintf(output, "# started on %s\n", ctime(&tm.tv_sec)); | 1198 | fprintf(output, "# started on %s\n", ctime(&tm.tv_sec)); |
| 1193 | } else if (output_fd != 2) { | 1199 | } else if (output_fd > 0) { |
| 1194 | mode = append_file ? "a" : "w"; | 1200 | mode = append_file ? "a" : "w"; |
| 1195 | output = fdopen(output_fd, mode); | 1201 | output = fdopen(output_fd, mode); |
| 1196 | if (!output) { | 1202 | if (!output) { |
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, | |||
| 1942 | else | 1942 | else |
| 1943 | return -1; | 1943 | return -1; |
| 1944 | } else if (ph->needs_swap) { | 1944 | } else if (ph->needs_swap) { |
| 1945 | unsigned int i; | ||
| 1946 | /* | 1945 | /* |
| 1947 | * feature bitmap is declared as an array of unsigned longs -- | 1946 | * feature bitmap is declared as an array of unsigned longs -- |
| 1948 | * not good since its size can differ between the host that | 1947 | * 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, | |||
| 1958 | * file), punt and fallback to the original behavior -- | 1957 | * file), punt and fallback to the original behavior -- |
| 1959 | * clearing all feature bits and setting buildid. | 1958 | * clearing all feature bits and setting buildid. |
| 1960 | */ | 1959 | */ |
| 1961 | for (i = 0; i < BITS_TO_LONGS(HEADER_FEAT_BITS); ++i) | 1960 | mem_bswap_64(&header->adds_features, |
| 1962 | header->adds_features[i] = bswap_64(header->adds_features[i]); | 1961 | BITS_TO_U64(HEADER_FEAT_BITS)); |
| 1963 | 1962 | ||
| 1964 | if (!test_bit(HEADER_HOSTNAME, header->adds_features)) { | 1963 | if (!test_bit(HEADER_HOSTNAME, header->adds_features)) { |
| 1965 | for (i = 0; i < BITS_TO_LONGS(HEADER_FEAT_BITS); ++i) { | 1964 | /* unswap as u64 */ |
| 1966 | header->adds_features[i] = bswap_64(header->adds_features[i]); | 1965 | mem_bswap_64(&header->adds_features, |
| 1967 | header->adds_features[i] = bswap_32(header->adds_features[i]); | 1966 | BITS_TO_U64(HEADER_FEAT_BITS)); |
| 1968 | } | 1967 | |
| 1968 | /* unswap as u32 */ | ||
| 1969 | mem_bswap_32(&header->adds_features, | ||
| 1970 | BITS_TO_U32(HEADER_FEAT_BITS)); | ||
| 1969 | } | 1971 | } |
| 1970 | 1972 | ||
| 1971 | if (!test_bit(HEADER_HOSTNAME, header->adds_features)) { | 1973 | if (!test_bit(HEADER_HOSTNAME, header->adds_features)) { |
| @@ -2091,6 +2093,35 @@ static int read_attr(int fd, struct perf_header *ph, | |||
| 2091 | return ret <= 0 ? -1 : 0; | 2093 | return ret <= 0 ? -1 : 0; |
| 2092 | } | 2094 | } |
| 2093 | 2095 | ||
| 2096 | static int perf_evsel__set_tracepoint_name(struct perf_evsel *evsel) | ||
| 2097 | { | ||
| 2098 | struct event_format *event = trace_find_event(evsel->attr.config); | ||
| 2099 | char bf[128]; | ||
| 2100 | |||
| 2101 | if (event == NULL) | ||
| 2102 | return -1; | ||
| 2103 | |||
| 2104 | snprintf(bf, sizeof(bf), "%s:%s", event->system, event->name); | ||
| 2105 | evsel->name = strdup(bf); | ||
| 2106 | if (event->name == NULL) | ||
| 2107 | return -1; | ||
| 2108 | |||
| 2109 | return 0; | ||
| 2110 | } | ||
| 2111 | |||
| 2112 | static int perf_evlist__set_tracepoint_names(struct perf_evlist *evlist) | ||
| 2113 | { | ||
| 2114 | struct perf_evsel *pos; | ||
| 2115 | |||
| 2116 | list_for_each_entry(pos, &evlist->entries, node) { | ||
| 2117 | if (pos->attr.type == PERF_TYPE_TRACEPOINT && | ||
| 2118 | perf_evsel__set_tracepoint_name(pos)) | ||
| 2119 | return -1; | ||
| 2120 | } | ||
| 2121 | |||
| 2122 | return 0; | ||
| 2123 | } | ||
| 2124 | |||
| 2094 | int perf_session__read_header(struct perf_session *session, int fd) | 2125 | int perf_session__read_header(struct perf_session *session, int fd) |
| 2095 | { | 2126 | { |
| 2096 | struct perf_header *header = &session->header; | 2127 | struct perf_header *header = &session->header; |
| @@ -2172,6 +2203,9 @@ int perf_session__read_header(struct perf_session *session, int fd) | |||
| 2172 | 2203 | ||
| 2173 | lseek(fd, header->data_offset, SEEK_SET); | 2204 | lseek(fd, header->data_offset, SEEK_SET); |
| 2174 | 2205 | ||
| 2206 | if (perf_evlist__set_tracepoint_names(session->evlist)) | ||
| 2207 | goto out_delete_evlist; | ||
| 2208 | |||
| 2175 | header->frozen = 1; | 2209 | header->frozen = 1; |
| 2176 | return 0; | 2210 | return 0; |
| 2177 | out_errno: | 2211 | out_errno: |
diff --git a/tools/perf/util/include/linux/bitops.h b/tools/perf/util/include/linux/bitops.h index f1584833bd22..587a230d2075 100644 --- a/tools/perf/util/include/linux/bitops.h +++ b/tools/perf/util/include/linux/bitops.h | |||
| @@ -8,6 +8,8 @@ | |||
| 8 | #define BITS_PER_LONG __WORDSIZE | 8 | #define BITS_PER_LONG __WORDSIZE |
| 9 | #define BITS_PER_BYTE 8 | 9 | #define BITS_PER_BYTE 8 |
| 10 | #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) | 10 | #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) |
| 11 | #define BITS_TO_U64(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u64)) | ||
| 12 | #define BITS_TO_U32(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u32)) | ||
| 11 | 13 | ||
| 12 | #define for_each_set_bit(bit, addr, size) \ | 14 | #define for_each_set_bit(bit, addr, size) \ |
| 13 | for ((bit) = find_first_bit((addr), (size)); \ | 15 | for ((bit) = find_first_bit((addr), (size)); \ |
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 2600916efa83..c3e399bcf18d 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
| @@ -442,6 +442,16 @@ static void perf_tool__fill_defaults(struct perf_tool *tool) | |||
| 442 | tool->finished_round = process_finished_round_stub; | 442 | tool->finished_round = process_finished_round_stub; |
| 443 | } | 443 | } |
| 444 | } | 444 | } |
| 445 | |||
| 446 | void mem_bswap_32(void *src, int byte_size) | ||
| 447 | { | ||
| 448 | u32 *m = src; | ||
| 449 | while (byte_size > 0) { | ||
| 450 | *m = bswap_32(*m); | ||
| 451 | byte_size -= sizeof(u32); | ||
| 452 | ++m; | ||
| 453 | } | ||
| 454 | } | ||
| 445 | 455 | ||
| 446 | void mem_bswap_64(void *src, int byte_size) | 456 | void mem_bswap_64(void *src, int byte_size) |
| 447 | { | 457 | { |
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index 7a5434c00565..0c702e3f0a36 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h | |||
| @@ -80,6 +80,7 @@ struct branch_info *machine__resolve_bstack(struct machine *self, | |||
| 80 | bool perf_session__has_traces(struct perf_session *self, const char *msg); | 80 | bool perf_session__has_traces(struct perf_session *self, const char *msg); |
| 81 | 81 | ||
| 82 | void mem_bswap_64(void *src, int byte_size); | 82 | void mem_bswap_64(void *src, int byte_size); |
| 83 | void mem_bswap_32(void *src, int byte_size); | ||
| 83 | void perf_event__attr_swap(struct perf_event_attr *attr); | 84 | void perf_event__attr_swap(struct perf_event_attr *attr); |
| 84 | 85 | ||
| 85 | int perf_session__create_kernel_maps(struct perf_session *self); | 86 | int perf_session__create_kernel_maps(struct perf_session *self); |
