Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 234363
b: refs/heads/master
c: d0dd74e
h: refs/heads/master
i:
  234361: b8dd368
  234359: 56bf440
v: v3
  • Loading branch information
Arnaldo Carvalho de Melo committed Jan 24, 2011
1 parent 4fb7e75 commit f7791a2
Show file tree
Hide file tree
Showing 8 changed files with 135 additions and 141 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: fd78260b5376173faeb17127bd63b3c99a8e8bfb
refs/heads/master: d0dd74e853a0a6f37e8061d6d50be41c7034c54c
11 changes: 1 addition & 10 deletions trunk/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 trunk/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 trunk/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 trunk/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 trunk/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 trunk/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 trunk/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 f7791a2

Please sign in to comment.