root@kbl-ppc:~# perf stat --per-thread -e cycles,instructions -I1000 
--interval-count 2
     1.004171683             perf-3696              8,747,311      cycles
        ...
     1.004171683             perf-3696                691,730      instructions 
             #    0.08  insn per cycle
        ...
     2.006490373             perf-3696              1,749,936      cycles
        ...
     2.006490373             perf-3696              1,484,582      instructions 
             #    0.28  insn per cycle
        ...

Let's see interval 2.006490373

perf-3696              1,749,936      cycles
perf-3696              1,484,582      instructions              #    0.28  insn 
per cycle

insn per cycle = 1,484,582 / 1,749,936 = 0.85.
But now it's 0.28, that's not correct.

stat_config.stats[] records the per-thread runtime stat. But for interval
mode, it should be reset for each interval.

So now, with this patch,

root@kbl-ppc:~# perf stat --per-thread -e cycles,instructions -I1000 
--interval-count 2
     1.005818121             perf-8633              9,898,045      cycles
        ...
     1.005818121             perf-8633                693,298      instructions 
             #    0.07  insn per cycle
        ...
     2.007863743             perf-8633              1,551,619      cycles
        ...
     2.007863743             perf-8633              1,317,514      instructions 
             #    0.85  insn per cycle
        ...

Let's check interval 2.007863743.

insn per cycle = 1,317,514 / 1,551,619 = 0.85. It's correct.

This patch creates runtime_stat_reset, places it next to
untime_stat_new/runtime_stat_delete and moves all runtime_stat
functions before process_interval.

 v4:
 ---
 Create runtime_stat_reset.

Fixes: commit 14e72a21c783 ("perf stat: Update or print per-thread stats")
Signed-off-by: Jin Yao <yao....@linux.intel.com>
---
 tools/perf/builtin-stat.c | 70 +++++++++++++++++++++++----------------
 1 file changed, 41 insertions(+), 29 deletions(-)

diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index e0c1ad23c768..f3b3a59ac7d2 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -351,6 +351,46 @@ static void read_counters(struct timespec *rs)
        }
 }
 
+static int runtime_stat_new(struct perf_stat_config *config, int nthreads)
+{
+       int i;
+
+       config->stats = calloc(nthreads, sizeof(struct runtime_stat));
+       if (!config->stats)
+               return -1;
+
+       config->stats_num = nthreads;
+
+       for (i = 0; i < nthreads; i++)
+               runtime_stat__init(&config->stats[i]);
+
+       return 0;
+}
+
+static void runtime_stat_delete(struct perf_stat_config *config)
+{
+       int i;
+
+       if (!config->stats)
+               return;
+
+       for (i = 0; i < config->stats_num; i++)
+               runtime_stat__exit(&config->stats[i]);
+
+       zfree(&config->stats);
+}
+
+static void runtime_stat_reset(struct perf_stat_config *config)
+{
+       int i;
+
+       if (!config->stats)
+               return;
+
+       for (i = 0; i < config->stats_num; i++)
+               perf_stat__reset_shadow_per_stat(&config->stats[i]);
+}
+
 static void process_interval(void)
 {
        struct timespec ts, rs;
@@ -359,6 +399,7 @@ static void process_interval(void)
        diff_timespec(&rs, &ts, &ref_time);
 
        perf_stat__reset_shadow_per_stat(&rt_stat);
+       runtime_stat_reset(&stat_config);
        read_counters(&rs);
 
        if (STAT_RECORD) {
@@ -1737,35 +1778,6 @@ int process_cpu_map_event(struct perf_session *session,
        return set_maps(st);
 }
 
-static int runtime_stat_new(struct perf_stat_config *config, int nthreads)
-{
-       int i;
-
-       config->stats = calloc(nthreads, sizeof(struct runtime_stat));
-       if (!config->stats)
-               return -1;
-
-       config->stats_num = nthreads;
-
-       for (i = 0; i < nthreads; i++)
-               runtime_stat__init(&config->stats[i]);
-
-       return 0;
-}
-
-static void runtime_stat_delete(struct perf_stat_config *config)
-{
-       int i;
-
-       if (!config->stats)
-               return;
-
-       for (i = 0; i < config->stats_num; i++)
-               runtime_stat__exit(&config->stats[i]);
-
-       zfree(&config->stats);
-}
-
 static const char * const stat_report_usage[] = {
        "perf stat report [<options>]",
        NULL,
-- 
2.17.1

Reply via email to