lkml.org 
[lkml]   [2013]   [Nov]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH 4/4] perf tools: add the feature to assign analysis interval to perf report
Date
Only process the samples whose timestamp is in [start, end).

Cc: David Ahern <dsahern@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Yanmin Zhang <yanmin.zhang@intel.com>
Cc: Wu Fengguang <fengguang.wu@intel.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Chenggang Qin <chenggang.qcg@taobao.com>

---
tools/perf/util/session.c | 43 +++++++++++++++++++++++++++++++++++++++++--
1 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 4e9dd66..d50e29e 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -532,6 +532,9 @@ static int flush_sample_queue(struct perf_session *s,
bool show_progress = limit == ULLONG_MAX;
int ret;

+ if (limit > s->tend)
+ limit = s->tend;
+
if (!tool->ordered_samples || !limit)
return 0;

@@ -539,6 +542,9 @@ static int flush_sample_queue(struct perf_session *s,
if (session_done())
return 0;

+ if (iter->timestamp < s->tstart)
+ continue;
+
if (iter->timestamp > limit)
break;

@@ -617,7 +623,26 @@ static int process_finished_round(struct perf_tool *tool,
union perf_event *event __maybe_unused,
struct perf_session *session)
{
- int ret = flush_sample_queue(session, tool);
+ int ret = 0;
+
+ /*
+ * The next round should be processed continue.
+ * But, this round is skipped.
+ */
+ if (session->ordered_samples.next_flush < session->tstart) {
+ session->ordered_samples.next_flush = session->ordered_samples.max_timestamp;
+ return ret;
+ }
+
+ /*
+ * This round & all followed rounds are skipped.
+ */
+ if (session->ordered_samples.min_timestamp > session->tend) {
+ session->ordered_samples.next_flush = ULLONG_MAX;
+ return ret;
+ }
+
+ ret = flush_sample_queue(session, tool);
if (!ret)
session->ordered_samples.next_flush = session->ordered_samples.max_timestamp;

@@ -1373,6 +1398,14 @@ more:
goto out_err;
}

+ /*
+ * After process a finished round event:
+ * The minimal timestamp in os->samples is greater than
+ * tend, so, the followed events couldn't be processed.
+ */
+ if (session->ordered_samples.next_flush == ULLONG_MAX)
+ goto out_err;
+
head += size;
file_pos += size;

@@ -1389,8 +1422,14 @@ more:
if (file_pos < file_size)
goto more;

+ if (session->ordered_samples.max_timestamp < session->tstart)
+ goto out_err;
+
+ if (session->ordered_samples.min_timestamp > session->tend)
+ goto out_err;
+
/* do the final flush for ordered samples */
- session->ordered_samples.next_flush = ULLONG_MAX;
+ session->ordered_samples.next_flush = session->tend;
err = flush_sample_queue(session, tool);
out_err:
ui_progress__finish();
--
1.7.8.rc2.5.g815b


\
 
 \ /
  Last update: 2013-11-01 11:01    [W:0.069 / U:0.784 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site