Skip to content

Commit

Permalink
perf tools: Move event__parse_sample to evsel.c
Browse files Browse the repository at this point in the history
To avoid linking more stuff in the python binding I'm working on, future
csets will make the sample type be taken from the evsel itself, but for
that we need to first have one file per cpu and per sample_type, not a
single perf.data file.

Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Arnaldo Carvalho de Melo committed Jan 24, 2011
1 parent fd78260 commit d0dd74e
Show file tree
Hide file tree
Showing 7 changed files with 134 additions and 140 deletions.
11 changes: 1 addition & 10 deletions tools/perf/builtin-test.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
#include "util/evlist.h"
#include "util/parse-options.h"
#include "util/parse-events.h"
#include "util/session.h"
#include "util/symbol.h"
#include "util/thread_map.h"

Expand Down Expand Up @@ -457,7 +456,6 @@ static int test__basic_mmap(void)
int err = -1;
event_t *event;
struct thread_map *threads;
struct perf_session session;
struct cpu_map *cpus;
struct perf_evlist *evlist;
struct perf_event_attr attr = {
Expand Down Expand Up @@ -521,13 +519,6 @@ static int test__basic_mmap(void)
attr.wakeup_events = 1;
attr.sample_period = 1;

/*
* FIXME: use evsel->attr.sample_type in event__parse_sample.
* This will nicely remove the requirement that we have
* all the events with the same sample_type.
*/
session.sample_type = attr.sample_type;

for (i = 0; i < nsyscalls; ++i) {
attr.config = ids[i];
evsels[i] = perf_evsel__new(&attr, i);
Expand Down Expand Up @@ -567,7 +558,7 @@ static int test__basic_mmap(void)
goto out_munmap;
}

event__parse_sample(event, &session, &sample);
event__parse_sample(event, attr.sample_type, false, &sample);
evsel = perf_evlist__id2evsel(evlist, sample.id);
if (evsel == NULL) {
pr_debug("event with id %" PRIu64
Expand Down
2 changes: 1 addition & 1 deletion tools/perf/builtin-top.c
Original file line number Diff line number Diff line change
Expand Up @@ -1106,7 +1106,7 @@ static void perf_session__mmap_read_cpu(struct perf_session *self, int cpu)
event_t *event;

while ((event = perf_evlist__read_on_cpu(evsel_list, cpu)) != NULL) {
event__parse_sample(event, self, &sample);
perf_session__parse_sample(self, event, &sample);

if (event->header.type == PERF_RECORD_SAMPLE)
event__process_sample(event, &sample, self);
Expand Down
125 changes: 0 additions & 125 deletions tools/perf/util/event.c
Original file line number Diff line number Diff line change
Expand Up @@ -826,128 +826,3 @@ int event__preprocess_sample(const event_t *self, struct perf_session *session,
al->filtered = true;
return 0;
}

static int event__parse_id_sample(const event_t *event,
struct perf_session *session,
struct sample_data *sample)
{
const u64 *array;
u64 type;

sample->cpu = sample->pid = sample->tid = -1;
sample->stream_id = sample->id = sample->time = -1ULL;

if (!session->sample_id_all)
return 0;

array = event->sample.array;
array += ((event->header.size -
sizeof(event->header)) / sizeof(u64)) - 1;
type = session->sample_type;

if (type & PERF_SAMPLE_CPU) {
u32 *p = (u32 *)array;
sample->cpu = *p;
array--;
}

if (type & PERF_SAMPLE_STREAM_ID) {
sample->stream_id = *array;
array--;
}

if (type & PERF_SAMPLE_ID) {
sample->id = *array;
array--;
}

if (type & PERF_SAMPLE_TIME) {
sample->time = *array;
array--;
}

if (type & PERF_SAMPLE_TID) {
u32 *p = (u32 *)array;
sample->pid = p[0];
sample->tid = p[1];
}

return 0;
}

int event__parse_sample(const event_t *event, struct perf_session *session,
struct sample_data *data)
{
const u64 *array;
u64 type;

if (event->header.type != PERF_RECORD_SAMPLE)
return event__parse_id_sample(event, session, data);

array = event->sample.array;
type = session->sample_type;

if (type & PERF_SAMPLE_IP) {
data->ip = event->ip.ip;
array++;
}

if (type & PERF_SAMPLE_TID) {
u32 *p = (u32 *)array;
data->pid = p[0];
data->tid = p[1];
array++;
}

if (type & PERF_SAMPLE_TIME) {
data->time = *array;
array++;
}

if (type & PERF_SAMPLE_ADDR) {
data->addr = *array;
array++;
}

data->id = -1ULL;
if (type & PERF_SAMPLE_ID) {
data->id = *array;
array++;
}

if (type & PERF_SAMPLE_STREAM_ID) {
data->stream_id = *array;
array++;
}

if (type & PERF_SAMPLE_CPU) {
u32 *p = (u32 *)array;
data->cpu = *p;
array++;
} else
data->cpu = -1;

if (type & PERF_SAMPLE_PERIOD) {
data->period = *array;
array++;
}

if (type & PERF_SAMPLE_READ) {
pr_debug("PERF_SAMPLE_READ is unsuported for now\n");
return -1;
}

if (type & PERF_SAMPLE_CALLCHAIN) {
data->callchain = (struct ip_callchain *)array;
array += 1 + data->callchain->nr;
}

if (type & PERF_SAMPLE_RAW) {
u32 *p = (u32 *)array;
data->raw_size = *p;
p++;
data->raw_data = p;
}

return 0;
}
5 changes: 3 additions & 2 deletions tools/perf/util/event.h
Original file line number Diff line number Diff line change
Expand Up @@ -169,9 +169,10 @@ struct addr_location;
int event__preprocess_sample(const event_t *self, struct perf_session *session,
struct addr_location *al, struct sample_data *data,
symbol_filter_t filter);
int event__parse_sample(const event_t *event, struct perf_session *session,
struct sample_data *sample);

const char *event__get_event_name(unsigned int id);

int event__parse_sample(const event_t *event, u64 type, bool sample_id_all,
struct sample_data *sample);

#endif /* __PERF_RECORD_H */
118 changes: 118 additions & 0 deletions tools/perf/util/evsel.c
Original file line number Diff line number Diff line change
Expand Up @@ -355,3 +355,121 @@ int perf_evlist__mmap(struct perf_evlist *evlist, struct cpu_map *cpus,
}
return -1;
}

static int event__parse_id_sample(const event_t *event, u64 type,
struct sample_data *sample)
{
const u64 *array = event->sample.array;

array += ((event->header.size -
sizeof(event->header)) / sizeof(u64)) - 1;

if (type & PERF_SAMPLE_CPU) {
u32 *p = (u32 *)array;
sample->cpu = *p;
array--;
}

if (type & PERF_SAMPLE_STREAM_ID) {
sample->stream_id = *array;
array--;
}

if (type & PERF_SAMPLE_ID) {
sample->id = *array;
array--;
}

if (type & PERF_SAMPLE_TIME) {
sample->time = *array;
array--;
}

if (type & PERF_SAMPLE_TID) {
u32 *p = (u32 *)array;
sample->pid = p[0];
sample->tid = p[1];
}

return 0;
}

int event__parse_sample(const event_t *event, u64 type, bool sample_id_all,
struct sample_data *data)
{
const u64 *array;

data->cpu = data->pid = data->tid = -1;
data->stream_id = data->id = data->time = -1ULL;

if (event->header.type != PERF_RECORD_SAMPLE) {
if (!sample_id_all)
return 0;
return event__parse_id_sample(event, type, data);
}

array = event->sample.array;

if (type & PERF_SAMPLE_IP) {
data->ip = event->ip.ip;
array++;
}

if (type & PERF_SAMPLE_TID) {
u32 *p = (u32 *)array;
data->pid = p[0];
data->tid = p[1];
array++;
}

if (type & PERF_SAMPLE_TIME) {
data->time = *array;
array++;
}

if (type & PERF_SAMPLE_ADDR) {
data->addr = *array;
array++;
}

data->id = -1ULL;
if (type & PERF_SAMPLE_ID) {
data->id = *array;
array++;
}

if (type & PERF_SAMPLE_STREAM_ID) {
data->stream_id = *array;
array++;
}

if (type & PERF_SAMPLE_CPU) {
u32 *p = (u32 *)array;
data->cpu = *p;
array++;
}

if (type & PERF_SAMPLE_PERIOD) {
data->period = *array;
array++;
}

if (type & PERF_SAMPLE_READ) {
fprintf(stderr, "PERF_SAMPLE_READ is unsuported for now\n");
return -1;
}

if (type & PERF_SAMPLE_CALLCHAIN) {
data->callchain = (struct ip_callchain *)array;
array += 1 + data->callchain->nr;
}

if (type & PERF_SAMPLE_RAW) {
u32 *p = (u32 *)array;
data->raw_size = *p;
p++;
data->raw_data = p;
}

return 0;
}
4 changes: 2 additions & 2 deletions tools/perf/util/session.c
Original file line number Diff line number Diff line change
Expand Up @@ -496,7 +496,7 @@ static void flush_sample_queue(struct perf_session *s,
if (iter->timestamp > limit)
break;

event__parse_sample(iter->event, s, &sample);
perf_session__parse_sample(s, iter->event, &sample);
perf_session_deliver_event(s, iter->event, &sample, ops,
iter->file_offset);

Expand Down Expand Up @@ -806,7 +806,7 @@ static int perf_session__process_event(struct perf_session *session,
/*
* For all kernel events we get the sample data
*/
event__parse_sample(event, session, &sample);
perf_session__parse_sample(session, event, &sample);

/* Preprocess sample records - precheck callchains */
if (perf_session__preprocess_sample(session, event, &sample))
Expand Down
9 changes: 9 additions & 0 deletions tools/perf/util/session.h
Original file line number Diff line number Diff line change
Expand Up @@ -155,4 +155,13 @@ size_t perf_session__fprintf_nr_events(struct perf_session *self, FILE *fp)
{
return hists__fprintf_nr_events(&self->hists, fp);
}

static inline int perf_session__parse_sample(struct perf_session *session,
const event_t *event,
struct sample_data *sample)
{
return event__parse_sample(event, session->sample_type,
session->sample_id_all, sample);
}

#endif /* __PERF_SESSION_H */

0 comments on commit d0dd74e

Please sign in to comment.