Messages in this thread Patch in this message | | | From | Jiri Olsa <> | Subject | [PATCH 16/25] perf tools: Add perf data version 3 header read | Date | Sun, 1 Sep 2013 12:36:27 +0200 |
| |
Adding perf data version 3 header read code to load data for v3 format.
Signed-off-by: Jiri Olsa <jolsa@redhat.com> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: David Ahern <dsahern@gmail.com> --- tools/perf/util/header.c | 46 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 7 deletions(-)
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 77d588f..0bf0164 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -1780,17 +1780,26 @@ process_event_desc(struct perf_file_section *section __maybe_unused, struct perf_session *session; struct perf_evlist *evlist; struct perf_evsel *evsel; + struct perf_header *ph; + + session = container_of(header, struct perf_session, header); evlist = read_event_desc(header, fd); if (!evlist) - return 0; + return -1; - session = container_of(header, struct perf_session, header); + ph = &session->header; - list_for_each_entry(evsel, &evlist->entries, node) - perf_evlist__set_event_name(session->evlist, evsel); + if (ph->version <= PERF_HEADER_VERSION_2) { + list_for_each_entry(evsel, &evlist->entries, node) + perf_evlist__set_event_name(session->evlist, evsel); + + perf_evlist__delete(evlist); + } else { + session->evlist = session->evlist ?: evlist; + symbol_conf.nr_events = evlist->nr_entries; + } - perf_evlist__delete(evlist); return 0; } @@ -2859,15 +2868,38 @@ static int perf_session__read_header_v2(struct perf_session *session, return __perf_session__read_header_v2(session, header); } +static int perf_session__read_header_v3(struct perf_session *session, + struct perf_file_header *header) +{ + struct perf_header *ph = &session->header; + struct perf_file_header_v3 *v3 = &header->v3; + + memcpy(&ph->adds_features, &v3->adds_features, + sizeof(ph->adds_features)); + + ph->data_offset = v3->data.offset; + ph->data_size = v3->data.size; + ph->feat_offset = v3->features.offset; + + perf_header__process_sections(ph, session->fd, &session->pevent, + perf_file_section__process); + + return 0; +} + static int perf_header_read_file(struct perf_session *session) { struct perf_file_header header; + struct perf_header *ph = &session->header; if (perf_file_header__read(&header, &session->header, session->fd)) return -1; - /* read v2 specific data */ - return perf_session__read_header_v2(session, &header); + /* read version specific data */ + if (ph->version <= PERF_HEADER_VERSION_2) + return perf_session__read_header_v2(session, &header); + + return perf_session__read_header_v3(session, &header); } int perf_session__read_header(struct perf_session *session) -- 1.7.11.7
| |