|
@@ -80,14 +80,12 @@ out_close:
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
-void perf_session__update_sample_type(struct perf_session *self)
|
|
|
+void perf_session__set_id_hdr_size(struct perf_session *session)
|
|
|
{
|
|
|
- self->sample_type = perf_evlist__sample_type(self->evlist);
|
|
|
- self->sample_size = __perf_evsel__sample_size(self->sample_type);
|
|
|
- self->sample_id_all = perf_evlist__sample_id_all(self->evlist);
|
|
|
- self->id_hdr_size = perf_evlist__id_hdr_size(self->evlist);
|
|
|
- self->host_machine.id_hdr_size = self->id_hdr_size;
|
|
|
- machines__set_id_hdr_size(&self->machines, self->id_hdr_size);
|
|
|
+ u16 id_hdr_size = perf_evlist__id_hdr_size(session->evlist);
|
|
|
+
|
|
|
+ session->host_machine.id_hdr_size = id_hdr_size;
|
|
|
+ machines__set_id_hdr_size(&session->machines, id_hdr_size);
|
|
|
}
|
|
|
|
|
|
int perf_session__create_kernel_maps(struct perf_session *self)
|
|
@@ -147,7 +145,7 @@ struct perf_session *perf_session__new(const char *filename, int mode,
|
|
|
if (mode == O_RDONLY) {
|
|
|
if (perf_session__open(self, force) < 0)
|
|
|
goto out_delete;
|
|
|
- perf_session__update_sample_type(self);
|
|
|
+ perf_session__set_id_hdr_size(self);
|
|
|
} else if (mode == O_WRONLY) {
|
|
|
/*
|
|
|
* In O_RDONLY mode this will be performed when reading the
|
|
@@ -158,7 +156,7 @@ struct perf_session *perf_session__new(const char *filename, int mode,
|
|
|
}
|
|
|
|
|
|
if (tool && tool->ordering_requires_timestamps &&
|
|
|
- tool->ordered_samples && !self->sample_id_all) {
|
|
|
+ tool->ordered_samples && !perf_evlist__sample_id_all(self->evlist)) {
|
|
|
dump_printf("WARNING: No sample_id_all support, falling back to unordered processing\n");
|
|
|
tool->ordered_samples = false;
|
|
|
}
|
|
@@ -673,7 +671,8 @@ static void flush_sample_queue(struct perf_session *s,
|
|
|
if (iter->timestamp > limit)
|
|
|
break;
|
|
|
|
|
|
- ret = perf_session__parse_sample(s, iter->event, &sample);
|
|
|
+ ret = perf_evlist__parse_sample(s->evlist, iter->event, &sample,
|
|
|
+ s->header.needs_swap);
|
|
|
if (ret)
|
|
|
pr_err("Can't parse sample, err = %d\n", ret);
|
|
|
else
|
|
@@ -865,16 +864,18 @@ static void perf_session__print_tstamp(struct perf_session *session,
|
|
|
union perf_event *event,
|
|
|
struct perf_sample *sample)
|
|
|
{
|
|
|
+ u64 sample_type = perf_evlist__sample_type(session->evlist);
|
|
|
+
|
|
|
if (event->header.type != PERF_RECORD_SAMPLE &&
|
|
|
- !session->sample_id_all) {
|
|
|
+ !perf_evlist__sample_id_all(session->evlist)) {
|
|
|
fputs("-1 -1 ", stdout);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if ((session->sample_type & PERF_SAMPLE_CPU))
|
|
|
+ if ((sample_type & PERF_SAMPLE_CPU))
|
|
|
printf("%u ", sample->cpu);
|
|
|
|
|
|
- if (session->sample_type & PERF_SAMPLE_TIME)
|
|
|
+ if (sample_type & PERF_SAMPLE_TIME)
|
|
|
printf("%" PRIu64 " ", sample->time);
|
|
|
}
|
|
|
|
|
@@ -899,6 +900,8 @@ static void dump_event(struct perf_session *session, union perf_event *event,
|
|
|
static void dump_sample(struct perf_session *session, union perf_event *event,
|
|
|
struct perf_sample *sample)
|
|
|
{
|
|
|
+ u64 sample_type;
|
|
|
+
|
|
|
if (!dump_trace)
|
|
|
return;
|
|
|
|
|
@@ -906,10 +909,12 @@ static void dump_sample(struct perf_session *session, union perf_event *event,
|
|
|
event->header.misc, sample->pid, sample->tid, sample->ip,
|
|
|
sample->period, sample->addr);
|
|
|
|
|
|
- if (session->sample_type & PERF_SAMPLE_CALLCHAIN)
|
|
|
+ sample_type = perf_evlist__sample_type(session->evlist);
|
|
|
+
|
|
|
+ if (sample_type & PERF_SAMPLE_CALLCHAIN)
|
|
|
callchain__printf(sample);
|
|
|
|
|
|
- if (session->sample_type & PERF_SAMPLE_BRANCH_STACK)
|
|
|
+ if (sample_type & PERF_SAMPLE_BRANCH_STACK)
|
|
|
branch_stack__printf(sample);
|
|
|
}
|
|
|
|
|
@@ -1006,7 +1011,7 @@ static int perf_session__preprocess_sample(struct perf_session *session,
|
|
|
union perf_event *event, struct perf_sample *sample)
|
|
|
{
|
|
|
if (event->header.type != PERF_RECORD_SAMPLE ||
|
|
|
- !(session->sample_type & PERF_SAMPLE_CALLCHAIN))
|
|
|
+ !(perf_evlist__sample_type(session->evlist) & PERF_SAMPLE_CALLCHAIN))
|
|
|
return 0;
|
|
|
|
|
|
if (!ip_callchain__valid(sample->callchain, event)) {
|
|
@@ -1030,7 +1035,7 @@ static int perf_session__process_user_event(struct perf_session *session, union
|
|
|
case PERF_RECORD_HEADER_ATTR:
|
|
|
err = tool->attr(event, &session->evlist);
|
|
|
if (err == 0)
|
|
|
- perf_session__update_sample_type(session);
|
|
|
+ perf_session__set_id_hdr_size(session);
|
|
|
return err;
|
|
|
case PERF_RECORD_HEADER_EVENT_TYPE:
|
|
|
return tool->event_type(tool, event);
|
|
@@ -1065,7 +1070,7 @@ static int perf_session__process_event(struct perf_session *session,
|
|
|
int ret;
|
|
|
|
|
|
if (session->header.needs_swap)
|
|
|
- event_swap(event, session->sample_id_all);
|
|
|
+ event_swap(event, perf_evlist__sample_id_all(session->evlist));
|
|
|
|
|
|
if (event->header.type >= PERF_RECORD_HEADER_MAX)
|
|
|
return -EINVAL;
|
|
@@ -1078,7 +1083,8 @@ static int perf_session__process_event(struct perf_session *session,
|
|
|
/*
|
|
|
* For all kernel events we get the sample data
|
|
|
*/
|
|
|
- ret = perf_session__parse_sample(session, event, &sample);
|
|
|
+ ret = perf_evlist__parse_sample(session->evlist, event, &sample,
|
|
|
+ session->header.needs_swap);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
@@ -1389,9 +1395,9 @@ int perf_session__process_events(struct perf_session *self,
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-bool perf_session__has_traces(struct perf_session *self, const char *msg)
|
|
|
+bool perf_session__has_traces(struct perf_session *session, const char *msg)
|
|
|
{
|
|
|
- if (!(self->sample_type & PERF_SAMPLE_RAW)) {
|
|
|
+ if (!(perf_evlist__sample_type(session->evlist) & PERF_SAMPLE_RAW)) {
|
|
|
pr_err("No trace sample to read. Did you call 'perf %s'?\n", msg);
|
|
|
return false;
|
|
|
}
|