Commit 106a94a0 authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo

perf stat: Introduce read_counters function

Moving read counters logic into single read_counters function, which
will be called for both interval and overall processing legs.

The reason is to split reading and processing (following patches)
counters code, so we could read counters from other sources (like
perf.data) and process them in the same way as 'perf stat' command does.
Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1435310967-14570-15-git-send-email-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent f99f4719
...@@ -323,27 +323,35 @@ static int read_counter(struct perf_evsel *counter) ...@@ -323,27 +323,35 @@ static int read_counter(struct perf_evsel *counter)
return 0; return 0;
} }
static void print_interval(void) static void read_counters(bool close)
{ {
static int num_print_interval;
struct perf_evsel *counter; struct perf_evsel *counter;
struct perf_stat *ps; struct perf_stat *ps;
struct timespec ts, rs;
char prefix[64];
if (aggr_mode == AGGR_GLOBAL) {
evlist__for_each(evsel_list, counter) { evlist__for_each(evsel_list, counter) {
ps = counter->priv; ps = counter->priv;
memset(ps->res_stats, 0, sizeof(ps->res_stats)); memset(ps->res_stats, 0, sizeof(ps->res_stats));
if (aggr_mode == AGGR_GLOBAL)
read_counter_aggr(counter); read_counter_aggr(counter);
} else
} else {
evlist__for_each(evsel_list, counter) {
ps = counter->priv;
memset(ps->res_stats, 0, sizeof(ps->res_stats));
read_counter(counter); read_counter(counter);
if (close) {
perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter),
thread_map__nr(evsel_list->threads));
} }
} }
}
static void print_interval(void)
{
static int num_print_interval;
struct perf_evsel *counter;
struct timespec ts, rs;
char prefix[64];
read_counters(false);
clock_gettime(CLOCK_MONOTONIC, &ts); clock_gettime(CLOCK_MONOTONIC, &ts);
diff_timespec(&rs, &ts, &ref_time); diff_timespec(&rs, &ts, &ref_time);
...@@ -525,18 +533,7 @@ static int __run_perf_stat(int argc, const char **argv) ...@@ -525,18 +533,7 @@ static int __run_perf_stat(int argc, const char **argv)
update_stats(&walltime_nsecs_stats, t1 - t0); update_stats(&walltime_nsecs_stats, t1 - t0);
if (aggr_mode == AGGR_GLOBAL) { read_counters(true);
evlist__for_each(evsel_list, counter) {
read_counter_aggr(counter);
perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter),
thread_map__nr(evsel_list->threads));
}
} else {
evlist__for_each(evsel_list, counter) {
read_counter(counter);
perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter), 1);
}
}
return WEXITSTATUS(status); return WEXITSTATUS(status);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment