When perf detects data file has index table, process header part first and then rest data files in a row. Note that the indexed sample data is recorded for each cpu/thread separately, it's already ordered with respect to themselves so no need to use the ordered event queue interface.
Signed-off-by: Namhyung Kim <namhy...@kernel.org> --- tools/perf/perf.c | 1 + tools/perf/perf.h | 2 ++ tools/perf/util/session.c | 55 +++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/tools/perf/perf.c b/tools/perf/perf.c index 1fded922bcc8..9664d84a9f8c 100644 --- a/tools/perf/perf.c +++ b/tools/perf/perf.c @@ -28,6 +28,7 @@ const char perf_more_info_string[] = int use_browser = -1; static int use_pager = -1; const char *input_name; +bool perf_has_index; struct cmd_struct { const char *cmd; diff --git a/tools/perf/perf.h b/tools/perf/perf.h index 90129accffbe..f4b4d7d8752c 100644 --- a/tools/perf/perf.h +++ b/tools/perf/perf.h @@ -39,6 +39,8 @@ void pthread__unblock_sigwinch(void); #include "util/target.h" +extern bool perf_has_index; + struct record_opts { struct target target; bool group; diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 428149bc64d2..91fa9647f565 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -1586,7 +1586,9 @@ static int __perf_session__process_events(struct perf_session *session, mmap_size = MMAP_SIZE; if (mmap_size > file_size) { mmap_size = file_size; - session->one_mmap = true; + + if (!perf_has_index) + session->one_mmap = true; } memset(mmaps, 0, sizeof(mmaps)); @@ -1664,28 +1666,63 @@ out: err = perf_session__flush_thread_stacks(session); out_err: ui_progress__finish(); - perf_session__warn_about_errors(session); ordered_events__free(&session->ordered_events); auxtrace__free_events(session); session->one_mmap = false; return err; } +static int __perf_session__process_indexed_events(struct perf_session *session) +{ + struct perf_data_file *file = session->file; + struct perf_tool *tool = session->tool; + u64 size = perf_data_file__size(file); + int err = 0, i; + + for (i = 0; i < (int)session->header.nr_index; i++) { + struct perf_file_section *idx = &session->header.index[i]; + + if (!idx->size) + continue; + + /* + * For indexed data file, samples are processed for + * each cpu/thread so it's already ordered. However + * meta-events at index 0 should be processed in order. + */ + if (i > 0) + tool->ordered_events = false; + + err = __perf_session__process_events(session, idx->offset, + idx->size, size); + if (err < 0) + break; + } + + perf_session__warn_about_errors(session); + return err; +} + int perf_session__process_events(struct perf_session *session) { - u64 size = perf_data_file__size(session->file); + struct perf_data_file *file = session->file; + u64 size = perf_data_file__size(file); int err; if (perf_session__register_idle_thread(session) == NULL) return -ENOMEM; - if (!perf_data_file__is_pipe(session->file)) - err = __perf_session__process_events(session, - session->header.data_offset, - session->header.data_size, size); - else - err = __perf_session__process_pipe_events(session); + if (perf_data_file__is_pipe(file)) + return __perf_session__process_pipe_events(session); + if (perf_has_index) + return __perf_session__process_indexed_events(session); + + err = __perf_session__process_events(session, + session->header.data_offset, + session->header.data_size, + size); + perf_session__warn_about_errors(session); return err; } -- 2.6.0 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/