diff options
author | Dmitry Antipov <dmitry.antipov@linaro.org> | 2012-07-13 17:23:58 +0400 |
---|---|---|
committer | Dmitry Antipov <dmitry.antipov@linaro.org> | 2012-07-13 17:23:58 +0400 |
commit | 7654f8691e1198b075d728b785b1d66a953dbc88 (patch) | |
tree | 1609a4d29584f2ec49f9f0bae88997d961d2d30c | |
parent | 918227bb1b59444a2c467711fd50cc22bb4a897b (diff) |
perf sched replay: fix event lookuptracking-perf-llct-20120726.0tracking-perf-llct-20120725.0tracking-perf-llct-20120723.1tracking-perf-llct-20120723.0tracking-perf-llct-20120716.1tracking-perf-llct-20120716.0
Use new function trace_find_event_by_name to lookup events before
looking through /sys files. This helps 'perf sched replay' to map
event names to IDs correctly when processing perf.data recorded
on another machine.
Signed-off-by: Dmitry Antipov <dmitry.antipov@linaro.org>
-rw-r--r-- | tools/perf/util/evlist.c | 22 | ||||
-rw-r--r-- | tools/perf/util/trace-event-parse.c | 4 | ||||
-rw-r--r-- | tools/perf/util/trace-event.h | 1 |
3 files changed, 25 insertions, 2 deletions
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 7400fb3fc50c..58a5433c21dc 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -17,6 +17,7 @@ #include <unistd.h> #include "parse-events.h" +#include "trace-event.h" #include <sys/mman.h> @@ -242,12 +243,29 @@ int perf_evlist__set_tracepoints_handlers(struct perf_evlist *evlist, const struct perf_evsel_str_handler *assocs, size_t nr_assocs) { + struct event_format *event; struct perf_evsel *evsel; + char *p, *sys, *name; int err; - size_t i; + size_t i, off; for (i = 0; i < nr_assocs; i++) { - err = trace_event__id(assocs[i].name); + err = -ENOENT; + p = strchr(assocs[i].name, ':'); + if (!p) + goto out; + off = p - assocs[i].name; + sys = malloc(off + 1); + if (!sys) + err = -ENOMEM; + else { + memcpy(sys, assocs[i].name, off); + sys[off] = '\0'; + name = p + 1; + event = trace_find_event_by_name(sys, name); + err = event ? event->id : trace_event__id(assocs[i].name); + free(sys); + } if (err < 0) goto out; diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c index df2fddbf0cd2..44cbb40dfcdd 100644 --- a/tools/perf/util/trace-event-parse.c +++ b/tools/perf/util/trace-event-parse.c @@ -176,6 +176,10 @@ struct event_format *trace_find_event(int type) return pevent_find_event(pevent, type); } +struct event_format *trace_find_event_by_name(const char *sys, const char *name) +{ + return pevent_find_event_by_name(pevent, sys, name); +} void print_trace_event(int cpu, void *data, int size) { diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h index 639852ac1117..66f83a02cda0 100644 --- a/tools/perf/util/trace-event.h +++ b/tools/perf/util/trace-event.h @@ -40,6 +40,7 @@ int parse_event_file(char *buf, unsigned long size, char *sys); struct pevent_record *trace_peek_data(int cpu); struct event_format *trace_find_event(int type); +struct event_format *trace_find_event_by_name(const char *sys, const char *name); unsigned long long raw_field_value(struct event_format *event, const char *name, void *data); |