Hi,
On Sat, 9 Jun 2012 13:05:58 +0400, Dmitry Antipov wrote:
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.
Basically the same approach with the previous reply, please put this into trace_event__id(). And minor nits below..
Signed-off-by: Dmitry Antipov dmitry.antipov@linaro.org
tools/perf/util/evlist.c | 18 ++++++++++++++++-- tools/perf/util/trace-event-parse.c | 4 ++++ tools/perf/util/trace-event.h | 1 + 3 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 4ac5f5a..7ebb9c5 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> @@ -231,12 +232,25 @@ 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;
Is this really needed? It looks original trace_event__id() require this. But because we'll use pevent_find_event_by_name, the 'sys' part can be omitted from now on?
off = p - assocs[i].name;
sys = malloc(off + 1);
The malloc() can fail, please check the return value.
Thanks, Namhyung
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);
if (err < 0) goto out;free(sys);
diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c index df2fddb..44cbb40 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 639852a..66f83a0 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);