aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/session.c')
-rw-r--r--tools/perf/util/session.c66
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
68void perf_session__update_sample_type(struct perf_session *self) 68static 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;
91out:
92 session->id_hdr_size = size;
93}
94
95void 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
73void perf_session__set_sample_type(struct perf_session *session, u64 type) 101void 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
106void 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
78int perf_session__create_kernel_maps(struct perf_session *self) 113int 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
656static 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
621static int perf_session__process_event(struct perf_session *self, 673static 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",