diff options
Diffstat (limited to 'tools/perf/util/header.c')
-rw-r--r-- | tools/perf/util/header.c | 58 |
1 files changed, 42 insertions, 16 deletions
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 7cba0551a56..989fa2dee2f 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c | |||
@@ -152,6 +152,11 @@ void perf_header__set_feat(struct perf_header *self, int feat) | |||
152 | set_bit(feat, self->adds_features); | 152 | set_bit(feat, self->adds_features); |
153 | } | 153 | } |
154 | 154 | ||
155 | void perf_header__clear_feat(struct perf_header *self, int feat) | ||
156 | { | ||
157 | clear_bit(feat, self->adds_features); | ||
158 | } | ||
159 | |||
155 | bool perf_header__has_feat(const struct perf_header *self, int feat) | 160 | bool perf_header__has_feat(const struct perf_header *self, int feat) |
156 | { | 161 | { |
157 | return test_bit(feat, self->adds_features); | 162 | return test_bit(feat, self->adds_features); |
@@ -433,8 +438,10 @@ static int perf_header__adds_write(struct perf_header *self, int fd) | |||
433 | int idx = 0, err; | 438 | int idx = 0, err; |
434 | 439 | ||
435 | session = container_of(self, struct perf_session, header); | 440 | session = container_of(self, struct perf_session, header); |
436 | if (perf_session__read_build_ids(session, true)) | 441 | |
437 | perf_header__set_feat(self, HEADER_BUILD_ID); | 442 | if (perf_header__has_feat(self, HEADER_BUILD_ID && |
443 | !perf_session__read_build_ids(session, true))) | ||
444 | perf_header__clear_feat(self, HEADER_BUILD_ID); | ||
438 | 445 | ||
439 | nr_sections = bitmap_weight(self->adds_features, HEADER_FEAT_BITS); | 446 | nr_sections = bitmap_weight(self->adds_features, HEADER_FEAT_BITS); |
440 | if (!nr_sections) | 447 | if (!nr_sections) |
@@ -456,7 +463,7 @@ static int perf_header__adds_write(struct perf_header *self, int fd) | |||
456 | 463 | ||
457 | /* Write trace info */ | 464 | /* Write trace info */ |
458 | trace_sec->offset = lseek(fd, 0, SEEK_CUR); | 465 | trace_sec->offset = lseek(fd, 0, SEEK_CUR); |
459 | read_tracing_data(fd, attrs, nr_counters); | 466 | read_tracing_data(fd, &evsel_list); |
460 | trace_sec->size = lseek(fd, 0, SEEK_CUR) - trace_sec->offset; | 467 | trace_sec->size = lseek(fd, 0, SEEK_CUR) - trace_sec->offset; |
461 | } | 468 | } |
462 | 469 | ||
@@ -599,7 +606,7 @@ int perf_header__write(struct perf_header *self, int fd, bool at_exit) | |||
599 | static int perf_header__getbuffer64(struct perf_header *self, | 606 | static int perf_header__getbuffer64(struct perf_header *self, |
600 | int fd, void *buf, size_t size) | 607 | int fd, void *buf, size_t size) |
601 | { | 608 | { |
602 | if (do_read(fd, buf, size) <= 0) | 609 | if (readn(fd, buf, size) <= 0) |
603 | return -1; | 610 | return -1; |
604 | 611 | ||
605 | if (self->needs_swap) | 612 | if (self->needs_swap) |
@@ -655,7 +662,7 @@ int perf_file_header__read(struct perf_file_header *self, | |||
655 | { | 662 | { |
656 | lseek(fd, 0, SEEK_SET); | 663 | lseek(fd, 0, SEEK_SET); |
657 | 664 | ||
658 | if (do_read(fd, self, sizeof(*self)) <= 0 || | 665 | if (readn(fd, self, sizeof(*self)) <= 0 || |
659 | memcmp(&self->magic, __perf_magic, sizeof(self->magic))) | 666 | memcmp(&self->magic, __perf_magic, sizeof(self->magic))) |
660 | return -1; | 667 | return -1; |
661 | 668 | ||
@@ -816,7 +823,7 @@ static int perf_file_header__read_pipe(struct perf_pipe_file_header *self, | |||
816 | struct perf_header *ph, int fd, | 823 | struct perf_header *ph, int fd, |
817 | bool repipe) | 824 | bool repipe) |
818 | { | 825 | { |
819 | if (do_read(fd, self, sizeof(*self)) <= 0 || | 826 | if (readn(fd, self, sizeof(*self)) <= 0 || |
820 | memcmp(&self->magic, __perf_magic, sizeof(self->magic))) | 827 | memcmp(&self->magic, __perf_magic, sizeof(self->magic))) |
821 | return -1; | 828 | return -1; |
822 | 829 | ||
@@ -941,6 +948,24 @@ u64 perf_header__sample_type(struct perf_header *header) | |||
941 | return type; | 948 | return type; |
942 | } | 949 | } |
943 | 950 | ||
951 | bool perf_header__sample_id_all(const struct perf_header *header) | ||
952 | { | ||
953 | bool value = false, first = true; | ||
954 | int i; | ||
955 | |||
956 | for (i = 0; i < header->attrs; i++) { | ||
957 | struct perf_header_attr *attr = header->attr[i]; | ||
958 | |||
959 | if (first) { | ||
960 | value = attr->attr.sample_id_all; | ||
961 | first = false; | ||
962 | } else if (value != attr->attr.sample_id_all) | ||
963 | die("non matching sample_id_all"); | ||
964 | } | ||
965 | |||
966 | return value; | ||
967 | } | ||
968 | |||
944 | struct perf_event_attr * | 969 | struct perf_event_attr * |
945 | perf_header__find_attr(u64 id, struct perf_header *header) | 970 | perf_header__find_attr(u64 id, struct perf_header *header) |
946 | { | 971 | { |
@@ -987,21 +1012,23 @@ int event__synthesize_attr(struct perf_event_attr *attr, u16 ids, u64 *id, | |||
987 | 1012 | ||
988 | ev = malloc(size); | 1013 | ev = malloc(size); |
989 | 1014 | ||
1015 | if (ev == NULL) | ||
1016 | return -ENOMEM; | ||
1017 | |||
990 | ev->attr.attr = *attr; | 1018 | ev->attr.attr = *attr; |
991 | memcpy(ev->attr.id, id, ids * sizeof(u64)); | 1019 | memcpy(ev->attr.id, id, ids * sizeof(u64)); |
992 | 1020 | ||
993 | ev->attr.header.type = PERF_RECORD_HEADER_ATTR; | 1021 | ev->attr.header.type = PERF_RECORD_HEADER_ATTR; |
994 | ev->attr.header.size = size; | 1022 | ev->attr.header.size = size; |
995 | 1023 | ||
996 | err = process(ev, session); | 1024 | err = process(ev, NULL, session); |
997 | 1025 | ||
998 | free(ev); | 1026 | free(ev); |
999 | 1027 | ||
1000 | return err; | 1028 | return err; |
1001 | } | 1029 | } |
1002 | 1030 | ||
1003 | int event__synthesize_attrs(struct perf_header *self, | 1031 | int event__synthesize_attrs(struct perf_header *self, event__handler_t process, |
1004 | event__handler_t process, | ||
1005 | struct perf_session *session) | 1032 | struct perf_session *session) |
1006 | { | 1033 | { |
1007 | struct perf_header_attr *attr; | 1034 | struct perf_header_attr *attr; |
@@ -1071,7 +1098,7 @@ int event__synthesize_event_type(u64 event_id, char *name, | |||
1071 | ev.event_type.header.size = sizeof(ev.event_type) - | 1098 | ev.event_type.header.size = sizeof(ev.event_type) - |
1072 | (sizeof(ev.event_type.event_type.name) - size); | 1099 | (sizeof(ev.event_type.event_type.name) - size); |
1073 | 1100 | ||
1074 | err = process(&ev, session); | 1101 | err = process(&ev, NULL, session); |
1075 | 1102 | ||
1076 | return err; | 1103 | return err; |
1077 | } | 1104 | } |
@@ -1106,8 +1133,7 @@ int event__process_event_type(event_t *self, | |||
1106 | return 0; | 1133 | return 0; |
1107 | } | 1134 | } |
1108 | 1135 | ||
1109 | int event__synthesize_tracing_data(int fd, struct perf_event_attr *pattrs, | 1136 | int event__synthesize_tracing_data(int fd, struct list_head *pattrs, |
1110 | int nb_events, | ||
1111 | event__handler_t process, | 1137 | event__handler_t process, |
1112 | struct perf_session *session __unused) | 1138 | struct perf_session *session __unused) |
1113 | { | 1139 | { |
@@ -1118,7 +1144,7 @@ int event__synthesize_tracing_data(int fd, struct perf_event_attr *pattrs, | |||
1118 | memset(&ev, 0, sizeof(ev)); | 1144 | memset(&ev, 0, sizeof(ev)); |
1119 | 1145 | ||
1120 | ev.tracing_data.header.type = PERF_RECORD_HEADER_TRACING_DATA; | 1146 | ev.tracing_data.header.type = PERF_RECORD_HEADER_TRACING_DATA; |
1121 | size = read_tracing_data_size(fd, pattrs, nb_events); | 1147 | size = read_tracing_data_size(fd, pattrs); |
1122 | if (size <= 0) | 1148 | if (size <= 0) |
1123 | return size; | 1149 | return size; |
1124 | aligned_size = ALIGN(size, sizeof(u64)); | 1150 | aligned_size = ALIGN(size, sizeof(u64)); |
@@ -1126,9 +1152,9 @@ int event__synthesize_tracing_data(int fd, struct perf_event_attr *pattrs, | |||
1126 | ev.tracing_data.header.size = sizeof(ev.tracing_data); | 1152 | ev.tracing_data.header.size = sizeof(ev.tracing_data); |
1127 | ev.tracing_data.size = aligned_size; | 1153 | ev.tracing_data.size = aligned_size; |
1128 | 1154 | ||
1129 | process(&ev, session); | 1155 | process(&ev, NULL, session); |
1130 | 1156 | ||
1131 | err = read_tracing_data(fd, pattrs, nb_events); | 1157 | err = read_tracing_data(fd, pattrs); |
1132 | write_padded(fd, NULL, 0, padding); | 1158 | write_padded(fd, NULL, 0, padding); |
1133 | 1159 | ||
1134 | return aligned_size; | 1160 | return aligned_size; |
@@ -1186,7 +1212,7 @@ int event__synthesize_build_id(struct dso *pos, u16 misc, | |||
1186 | ev.build_id.header.size = sizeof(ev.build_id) + len; | 1212 | ev.build_id.header.size = sizeof(ev.build_id) + len; |
1187 | memcpy(&ev.build_id.filename, pos->long_name, pos->long_name_len); | 1213 | memcpy(&ev.build_id.filename, pos->long_name, pos->long_name_len); |
1188 | 1214 | ||
1189 | err = process(&ev, session); | 1215 | err = process(&ev, NULL, session); |
1190 | 1216 | ||
1191 | return err; | 1217 | return err; |
1192 | } | 1218 | } |