diff options
Diffstat (limited to 'tools/perf/util/header.c')
| -rw-r--r-- | tools/perf/util/header.c | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 2d1d97e0746d..79da0e50ef8f 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c | |||
| @@ -713,10 +713,18 @@ static int __event_process_build_id(struct build_id_event *bev, | |||
| 713 | 713 | ||
| 714 | dso = __dsos__findnew(head, filename); | 714 | dso = __dsos__findnew(head, filename); |
| 715 | if (dso != NULL) { | 715 | if (dso != NULL) { |
| 716 | char sbuild_id[BUILD_ID_SIZE * 2 + 1]; | ||
| 717 | |||
| 716 | dso__set_build_id(dso, &bev->build_id); | 718 | dso__set_build_id(dso, &bev->build_id); |
| 717 | if (filename[0] == '[') | 719 | |
| 718 | dso->kernel = dso_type; | 720 | if (filename[0] == '[') |
| 719 | } | 721 | dso->kernel = dso_type; |
| 722 | |||
| 723 | build_id__sprintf(dso->build_id, sizeof(dso->build_id), | ||
| 724 | sbuild_id); | ||
| 725 | pr_debug("build id event received for %s: %s\n", | ||
| 726 | dso->long_name, sbuild_id); | ||
| 727 | } | ||
| 720 | 728 | ||
| 721 | err = 0; | 729 | err = 0; |
| 722 | out: | 730 | out: |
| @@ -767,7 +775,7 @@ static int perf_file_section__process(struct perf_file_section *self, | |||
| 767 | 775 | ||
| 768 | switch (feat) { | 776 | switch (feat) { |
| 769 | case HEADER_TRACE_INFO: | 777 | case HEADER_TRACE_INFO: |
| 770 | trace_report(fd); | 778 | trace_report(fd, false); |
| 771 | break; | 779 | break; |
| 772 | 780 | ||
| 773 | case HEADER_BUILD_ID: | 781 | case HEADER_BUILD_ID: |
| @@ -782,12 +790,16 @@ static int perf_file_section__process(struct perf_file_section *self, | |||
| 782 | } | 790 | } |
| 783 | 791 | ||
| 784 | static int perf_file_header__read_pipe(struct perf_pipe_file_header *self, | 792 | static int perf_file_header__read_pipe(struct perf_pipe_file_header *self, |
| 785 | struct perf_header *ph, int fd) | 793 | struct perf_header *ph, int fd, |
| 794 | bool repipe) | ||
| 786 | { | 795 | { |
| 787 | if (do_read(fd, self, sizeof(*self)) <= 0 || | 796 | if (do_read(fd, self, sizeof(*self)) <= 0 || |
| 788 | memcmp(&self->magic, __perf_magic, sizeof(self->magic))) | 797 | memcmp(&self->magic, __perf_magic, sizeof(self->magic))) |
| 789 | return -1; | 798 | return -1; |
| 790 | 799 | ||
| 800 | if (repipe && do_write(STDOUT_FILENO, self, sizeof(*self)) < 0) | ||
| 801 | return -1; | ||
| 802 | |||
| 791 | if (self->size != sizeof(*self)) { | 803 | if (self->size != sizeof(*self)) { |
| 792 | u64 size = bswap_64(self->size); | 804 | u64 size = bswap_64(self->size); |
| 793 | 805 | ||
| @@ -805,7 +817,8 @@ static int perf_header__read_pipe(struct perf_session *session, int fd) | |||
| 805 | struct perf_header *self = &session->header; | 817 | struct perf_header *self = &session->header; |
| 806 | struct perf_pipe_file_header f_header; | 818 | struct perf_pipe_file_header f_header; |
| 807 | 819 | ||
| 808 | if (perf_file_header__read_pipe(&f_header, self, fd) < 0) { | 820 | if (perf_file_header__read_pipe(&f_header, self, fd, |
| 821 | session->repipe) < 0) { | ||
| 809 | pr_debug("incompatible file format\n"); | 822 | pr_debug("incompatible file format\n"); |
| 810 | return -EINVAL; | 823 | return -EINVAL; |
| 811 | } | 824 | } |
| @@ -1096,12 +1109,17 @@ int event__process_tracing_data(event_t *self, | |||
| 1096 | lseek(session->fd, offset + sizeof(struct tracing_data_event), | 1109 | lseek(session->fd, offset + sizeof(struct tracing_data_event), |
| 1097 | SEEK_SET); | 1110 | SEEK_SET); |
| 1098 | 1111 | ||
| 1099 | size_read = trace_report(session->fd); | 1112 | size_read = trace_report(session->fd, session->repipe); |
| 1100 | 1113 | ||
| 1101 | padding = ALIGN(size_read, sizeof(u64)) - size_read; | 1114 | padding = ALIGN(size_read, sizeof(u64)) - size_read; |
| 1102 | 1115 | ||
| 1103 | if (read(session->fd, buf, padding) < 0) | 1116 | if (read(session->fd, buf, padding) < 0) |
| 1104 | die("reading input file"); | 1117 | die("reading input file"); |
| 1118 | if (session->repipe) { | ||
| 1119 | int retw = write(STDOUT_FILENO, buf, padding); | ||
| 1120 | if (retw <= 0 || retw != padding) | ||
| 1121 | die("repiping tracing data padding"); | ||
| 1122 | } | ||
| 1105 | 1123 | ||
| 1106 | if (size_read + padding != size) | 1124 | if (size_read + padding != size) |
| 1107 | die("tracing data size mismatch"); | 1125 | die("tracing data size mismatch"); |
| @@ -1110,7 +1128,8 @@ int event__process_tracing_data(event_t *self, | |||
| 1110 | } | 1128 | } |
| 1111 | 1129 | ||
| 1112 | int event__synthesize_build_id(struct dso *pos, u16 misc, | 1130 | int event__synthesize_build_id(struct dso *pos, u16 misc, |
| 1113 | event__handler_t process, struct machine *machine, | 1131 | event__handler_t process, |
| 1132 | struct machine *machine, | ||
| 1114 | struct perf_session *session) | 1133 | struct perf_session *session) |
| 1115 | { | 1134 | { |
| 1116 | event_t ev; | 1135 | event_t ev; |
