aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Antipov <dmitry.antipov@linaro.org>2012-07-13 17:23:58 +0400
committerDmitry Antipov <dmitry.antipov@linaro.org>2012-07-13 17:23:58 +0400
commit7654f8691e1198b075d728b785b1d66a953dbc88 (patch)
tree1609a4d29584f2ec49f9f0bae88997d961d2d30c
parent918227bb1b59444a2c467711fd50cc22bb4a897b (diff)
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.c22
-rw-r--r--tools/perf/util/trace-event-parse.c4
-rw-r--r--tools/perf/util/trace-event.h1
3 files changed, 25 insertions, 2 deletions
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index 7400fb3fc50..58a5433c21d 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 df2fddbf0cd..44cbb40dfcd 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 639852ac111..66f83a02cda 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);