The evsel->prev_raw_counts is updated in perf_evsel__compute_deltas: perf_evsel__compute_deltas() { tmp = *perf_counts(evsel->prev_raw_counts, cpu, thread); *perf_counts(evsel->prev_raw_counts, cpu, thread) = *count; }
When we want to reset the evsel->prev_raw_counts in perf_evsel__reset_prev_raw_counts, zeroing the aggr is not enough, we need to reset the counts too. Signed-off-by: Jin Yao <yao....@linux.intel.com> --- tools/perf/util/counts.c | 5 +++++ tools/perf/util/counts.h | 2 ++ tools/perf/util/stat.c | 1 + 3 files changed, 8 insertions(+) diff --git a/tools/perf/util/counts.c b/tools/perf/util/counts.c index f94e1a23dad6..af3bf36f7c63 100644 --- a/tools/perf/util/counts.c +++ b/tools/perf/util/counts.c @@ -64,3 +64,8 @@ void perf_evsel__free_counts(struct evsel *evsel) perf_counts__delete(evsel->counts); evsel->counts = NULL; } + +void perf_evsel__reset_raw_counts(struct evsel *evsel) +{ + perf_counts__reset(evsel->prev_raw_counts); +} diff --git a/tools/perf/util/counts.h b/tools/perf/util/counts.h index 92196df4945f..15bb9acb7cb0 100644 --- a/tools/perf/util/counts.h +++ b/tools/perf/util/counts.h @@ -42,4 +42,6 @@ void perf_evsel__reset_counts(struct evsel *evsel); int perf_evsel__alloc_counts(struct evsel *evsel, int ncpus, int nthreads); void perf_evsel__free_counts(struct evsel *evsel); +void perf_evsel__reset_raw_counts(struct evsel *evsel); + #endif /* __PERF_COUNTS_H */ diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c index 774468341851..89e541564ed5 100644 --- a/tools/perf/util/stat.c +++ b/tools/perf/util/stat.c @@ -168,6 +168,7 @@ static void perf_evsel__reset_prev_raw_counts(struct evsel *evsel) evsel->prev_raw_counts->aggr.val = 0; evsel->prev_raw_counts->aggr.ena = 0; evsel->prev_raw_counts->aggr.run = 0; + perf_evsel__reset_raw_counts(evsel); } } -- 2.17.1