diff options
Diffstat (limited to 'tools/perf/util/session.c')
-rw-r--r-- | tools/perf/util/session.c | 66 |
1 files changed, 61 insertions, 5 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 08ec018966a8..5c756609104e 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
@@ -65,9 +65,37 @@ out_close: | |||
65 | return -1; | 65 | return -1; |
66 | } | 66 | } |
67 | 67 | ||
68 | void perf_session__update_sample_type(struct perf_session *self) | 68 | static void perf_session__id_header_size(struct perf_session *session) |
69 | { | 69 | { |
70 | self->sample_type = perf_header__sample_type(&self->header); | 70 | struct sample_data *data; |
71 | u64 sample_type = session->sample_type; | ||
72 | u16 size = 0; | ||
73 | |||
74 | if (!session->sample_id_all) | ||
75 | goto out; | ||
76 | |||
77 | if (sample_type & PERF_SAMPLE_TID) | ||
78 | size += sizeof(data->tid) * 2; | ||
79 | |||
80 | if (sample_type & PERF_SAMPLE_TIME) | ||
81 | size += sizeof(data->time); | ||
82 | |||
83 | if (sample_type & PERF_SAMPLE_ID) | ||
84 | size += sizeof(data->id); | ||
85 | |||
86 | if (sample_type & PERF_SAMPLE_STREAM_ID) | ||
87 | size += sizeof(data->stream_id); | ||
88 | |||
89 | if (sample_type & PERF_SAMPLE_CPU) | ||
90 | size += sizeof(data->cpu) * 2; | ||
91 | out: | ||
92 | session->id_hdr_size = size; | ||
93 | } | ||
94 | |||
95 | void perf_session__set_sample_id_all(struct perf_session *session, bool value) | ||
96 | { | ||
97 | session->sample_id_all = value; | ||
98 | perf_session__id_header_size(session); | ||
71 | } | 99 | } |
72 | 100 | ||
73 | void perf_session__set_sample_type(struct perf_session *session, u64 type) | 101 | void perf_session__set_sample_type(struct perf_session *session, u64 type) |
@@ -75,6 +103,13 @@ void perf_session__set_sample_type(struct perf_session *session, u64 type) | |||
75 | session->sample_type = type; | 103 | session->sample_type = type; |
76 | } | 104 | } |
77 | 105 | ||
106 | void perf_session__update_sample_type(struct perf_session *self) | ||
107 | { | ||
108 | self->sample_type = perf_header__sample_type(&self->header); | ||
109 | self->sample_id_all = perf_header__sample_id_all(&self->header); | ||
110 | perf_session__id_header_size(self); | ||
111 | } | ||
112 | |||
78 | int perf_session__create_kernel_maps(struct perf_session *self) | 113 | int perf_session__create_kernel_maps(struct perf_session *self) |
79 | { | 114 | { |
80 | int ret = machine__create_kernel_maps(&self->host_machine); | 115 | int ret = machine__create_kernel_maps(&self->host_machine); |
@@ -443,7 +478,7 @@ static void flush_sample_queue(struct perf_session *s, | |||
443 | if (iter->timestamp > limit) | 478 | if (iter->timestamp > limit) |
444 | break; | 479 | break; |
445 | 480 | ||
446 | event__parse_sample(iter->event, s->sample_type, &sample); | 481 | event__parse_sample(iter->event, s, &sample); |
447 | ops->sample(iter->event, &sample, s); | 482 | ops->sample(iter->event, &sample, s); |
448 | 483 | ||
449 | os->last_flush = iter->timestamp; | 484 | os->last_flush = iter->timestamp; |
@@ -618,6 +653,23 @@ static void callchain__dump(struct sample_data *sample) | |||
618 | printf("..... %2d: %016Lx\n", i, sample->callchain->ips[i]); | 653 | printf("..... %2d: %016Lx\n", i, sample->callchain->ips[i]); |
619 | } | 654 | } |
620 | 655 | ||
656 | static void perf_session__print_tstamp(struct perf_session *session, | ||
657 | event_t *event, | ||
658 | struct sample_data *sample) | ||
659 | { | ||
660 | if (event->header.type != PERF_RECORD_SAMPLE && | ||
661 | !session->sample_id_all) { | ||
662 | fputs("-1 -1 ", stdout); | ||
663 | return; | ||
664 | } | ||
665 | |||
666 | if ((session->sample_type & PERF_SAMPLE_CPU)) | ||
667 | printf("%u ", sample->cpu); | ||
668 | |||
669 | if (session->sample_type & PERF_SAMPLE_TIME) | ||
670 | printf("%Lu ", sample->time); | ||
671 | } | ||
672 | |||
621 | static int perf_session__process_event(struct perf_session *self, | 673 | static int perf_session__process_event(struct perf_session *self, |
622 | event_t *event, | 674 | event_t *event, |
623 | struct perf_event_ops *ops, | 675 | struct perf_event_ops *ops, |
@@ -630,8 +682,12 @@ static int perf_session__process_event(struct perf_session *self, | |||
630 | if (self->header.needs_swap && event__swap_ops[event->header.type]) | 682 | if (self->header.needs_swap && event__swap_ops[event->header.type]) |
631 | event__swap_ops[event->header.type](event); | 683 | event__swap_ops[event->header.type](event); |
632 | 684 | ||
633 | if (event->header.type == PERF_RECORD_SAMPLE) | 685 | if (event->header.type >= PERF_RECORD_MMAP && |
634 | event__parse_sample(event, self->sample_type, &sample); | 686 | event->header.type <= PERF_RECORD_SAMPLE) { |
687 | event__parse_sample(event, self, &sample); | ||
688 | if (dump_trace) | ||
689 | perf_session__print_tstamp(self, event, &sample); | ||
690 | } | ||
635 | 691 | ||
636 | if (event->header.type < PERF_RECORD_HEADER_MAX) { | 692 | if (event->header.type < PERF_RECORD_HEADER_MAX) { |
637 | dump_printf("%#Lx [%#x]: PERF_RECORD_%s", | 693 | dump_printf("%#Lx [%#x]: PERF_RECORD_%s", |