diff options
author | Namhyung Kim <namhyung.kim@lge.com> | 2012-09-05 22:10:46 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-09-06 09:51:02 -0400 |
commit | 831394bdd9dd3ac1661336505c7cbdfd786d8cd4 (patch) | |
tree | 08ce81df572942ce33ab84a2161a95127cd35ea4 | |
parent | ae42c6bb9300cf25990bd15f1bd6ee38598f7483 (diff) |
perf header: Prepare tracepoint events regardless of name
Current perf_evlist__set_tracepoint_names is a misnomer because it finds
and sets correspoding event_format in addition to the name. So skipping
it when a event has set name already caused a trouble.
Rename it and set name only a event doesn't have one.
Reported-by: David Ahern <dsahern@gmail.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1346897446-16569-2-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/perf/util/header.c | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 8b0b873c229..d07bc134e56 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c | |||
@@ -2295,33 +2295,39 @@ static int read_attr(int fd, struct perf_header *ph, | |||
2295 | return ret <= 0 ? -1 : 0; | 2295 | return ret <= 0 ? -1 : 0; |
2296 | } | 2296 | } |
2297 | 2297 | ||
2298 | static int perf_evsel__set_tracepoint_name(struct perf_evsel *evsel, | 2298 | static int perf_evsel__prepare_tracepoint_event(struct perf_evsel *evsel, |
2299 | struct pevent *pevent) | 2299 | struct pevent *pevent) |
2300 | { | 2300 | { |
2301 | struct event_format *event = pevent_find_event(pevent, | 2301 | struct event_format *event; |
2302 | evsel->attr.config); | ||
2303 | char bf[128]; | 2302 | char bf[128]; |
2304 | 2303 | ||
2304 | /* already prepared */ | ||
2305 | if (evsel->tp_format) | ||
2306 | return 0; | ||
2307 | |||
2308 | event = pevent_find_event(pevent, evsel->attr.config); | ||
2305 | if (event == NULL) | 2309 | if (event == NULL) |
2306 | return -1; | 2310 | return -1; |
2307 | 2311 | ||
2308 | snprintf(bf, sizeof(bf), "%s:%s", event->system, event->name); | 2312 | if (!evsel->name) { |
2309 | evsel->name = strdup(bf); | 2313 | snprintf(bf, sizeof(bf), "%s:%s", event->system, event->name); |
2310 | if (evsel->name == NULL) | 2314 | evsel->name = strdup(bf); |
2311 | return -1; | 2315 | if (evsel->name == NULL) |
2316 | return -1; | ||
2317 | } | ||
2312 | 2318 | ||
2313 | evsel->tp_format = event; | 2319 | evsel->tp_format = event; |
2314 | return 0; | 2320 | return 0; |
2315 | } | 2321 | } |
2316 | 2322 | ||
2317 | static int perf_evlist__set_tracepoint_names(struct perf_evlist *evlist, | 2323 | static int perf_evlist__prepare_tracepoint_events(struct perf_evlist *evlist, |
2318 | struct pevent *pevent) | 2324 | struct pevent *pevent) |
2319 | { | 2325 | { |
2320 | struct perf_evsel *pos; | 2326 | struct perf_evsel *pos; |
2321 | 2327 | ||
2322 | list_for_each_entry(pos, &evlist->entries, node) { | 2328 | list_for_each_entry(pos, &evlist->entries, node) { |
2323 | if (pos->attr.type == PERF_TYPE_TRACEPOINT && !pos->name && | 2329 | if (pos->attr.type == PERF_TYPE_TRACEPOINT && |
2324 | perf_evsel__set_tracepoint_name(pos, pevent)) | 2330 | perf_evsel__prepare_tracepoint_event(pos, pevent)) |
2325 | return -1; | 2331 | return -1; |
2326 | } | 2332 | } |
2327 | 2333 | ||
@@ -2409,7 +2415,8 @@ int perf_session__read_header(struct perf_session *session, int fd) | |||
2409 | 2415 | ||
2410 | lseek(fd, header->data_offset, SEEK_SET); | 2416 | lseek(fd, header->data_offset, SEEK_SET); |
2411 | 2417 | ||
2412 | if (perf_evlist__set_tracepoint_names(session->evlist, session->pevent)) | 2418 | if (perf_evlist__prepare_tracepoint_events(session->evlist, |
2419 | session->pevent)) | ||
2413 | goto out_delete_evlist; | 2420 | goto out_delete_evlist; |
2414 | 2421 | ||
2415 | header->frozen = 1; | 2422 | header->frozen = 1; |
@@ -2643,7 +2650,8 @@ int perf_event__process_tracing_data(union perf_event *event, | |||
2643 | if (size_read + padding != size) | 2650 | if (size_read + padding != size) |
2644 | die("tracing data size mismatch"); | 2651 | die("tracing data size mismatch"); |
2645 | 2652 | ||
2646 | perf_evlist__set_tracepoint_names(session->evlist, session->pevent); | 2653 | perf_evlist__prepare_tracepoint_events(session->evlist, |
2654 | session->pevent); | ||
2647 | 2655 | ||
2648 | return size_read + padding; | 2656 | return size_read + padding; |
2649 | } | 2657 | } |