From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752163AbbERAl3 (ORCPT ); Sun, 17 May 2015 20:41:29 -0400 Received: from LGEMRELSE6Q.lge.com ([156.147.1.121]:54561 "EHLO lgemrelse6q.lge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751849AbbERAlB (ORCPT ); Sun, 17 May 2015 20:41:01 -0400 X-Original-SENDERIP: 10.177.220.203 X-Original-MAILFROM: namhyung@kernel.org From: Namhyung Kim To: Arnaldo Carvalho de Melo Cc: Ingo Molnar , Peter Zijlstra , Jiri Olsa , LKML , David Ahern , Adrian Hunter , Andi Kleen , Frederic Weisbecker , Stephane Eranian Subject: [PATCH 07/40] perf tools: Handle indexed data file properly Date: Mon, 18 May 2015 09:30:22 +0900 Message-Id: <1431909055-21442-8-git-send-email-namhyung@kernel.org> X-Mailer: git-send-email 2.4.0 In-Reply-To: <1431909055-21442-1-git-send-email-namhyung@kernel.org> References: <1431909055-21442-1-git-send-email-namhyung@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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 b857fcbd00cf..960942d9a0b7 100644 --- a/tools/perf/perf.c +++ b/tools/perf/perf.c @@ -27,6 +27,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 aa79fb8a16d4..61ce68d5c59f 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 e722107f932a..edb6ca22bff2 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -1486,7 +1486,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)); @@ -1561,28 +1563,63 @@ static int __perf_session__process_events(struct perf_session *session, err = auxtrace__flush_events(session, tool); 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.4.0