From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752013AbbJBFam (ORCPT ); Fri, 2 Oct 2015 01:30:42 -0400 Received: from mail-pa0-f53.google.com ([209.85.220.53]:34656 "EHLO mail-pa0-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751660AbbJBFXe (ORCPT ); Fri, 2 Oct 2015 01:23:34 -0400 From: Namhyung Kim To: Arnaldo Carvalho de Melo Cc: Ingo Molnar , Peter Zijlstra , Jiri Olsa , LKML , Frederic Weisbecker , Stephane Eranian , David Ahern , Andi Kleen Subject: [RFC/PATCH 08/38] perf tools: Handle indexed data file properly Date: Fri, 2 Oct 2015 14:18:49 +0900 Message-Id: <1443763159-29098-9-git-send-email-namhyung@kernel.org> X-Mailer: git-send-email 2.6.0 In-Reply-To: <1443763159-29098-1-git-send-email-namhyung@kernel.org> References: <1443763159-29098-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 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