Commit 905365f4 authored by Jin Yao's avatar Jin Yao Committed by Arnaldo Carvalho de Melo

perf stat: Save aggr value to first member of prev_raw_counts

To collect the overall statistics for interval mode, we copy the counts
from evsel->prev_raw_counts to evsel->counts.

For AGGR_GLOBAL mode, because the perf_stat_process_counter creates aggr
values from per cpu values, but the per cpu values are 0, so the
calculated aggr values will be always 0.

This patch uses a trick that saves the previous aggr value to the first
member of perf_counts, then aggr calculation in process_counter_values
can work correctly for AGGR_GLOBAL.

 v6:
 ---
 Add comments in perf_evlist__save_aggr_prev_raw_counts.
Signed-off-by: default avatarJin Yao <yao.jin@linux.intel.com>
Reviewed-by: default avatarJiri Olsa <jolsa@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jin Yao <yao.jin@intel.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lore.kernel.org/lkml/20200520042737.24160-5-yao.jin@linux.intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 297767ac
...@@ -249,6 +249,26 @@ void perf_evlist__copy_prev_raw_counts(struct evlist *evlist) ...@@ -249,6 +249,26 @@ void perf_evlist__copy_prev_raw_counts(struct evlist *evlist)
perf_evsel__copy_prev_raw_counts(evsel); perf_evsel__copy_prev_raw_counts(evsel);
} }
void perf_evlist__save_aggr_prev_raw_counts(struct evlist *evlist)
{
struct evsel *evsel;
/*
* To collect the overall statistics for interval mode,
* we copy the counts from evsel->prev_raw_counts to
* evsel->counts. The perf_stat_process_counter creates
* aggr values from per cpu values, but the per cpu values
* are 0 for AGGR_GLOBAL. So we use a trick that saves the
* previous aggr value to the first member of perf_counts,
* then aggr calculation in process_counter_values can work
* correctly.
*/
evlist__for_each_entry(evlist, evsel) {
*perf_counts(evsel->prev_raw_counts, 0, 0) =
evsel->prev_raw_counts->aggr;
}
}
static void zero_per_pkg(struct evsel *counter) static void zero_per_pkg(struct evsel *counter)
{ {
if (counter->per_pkg_mask) if (counter->per_pkg_mask)
......
...@@ -199,6 +199,7 @@ void perf_evlist__free_stats(struct evlist *evlist); ...@@ -199,6 +199,7 @@ void perf_evlist__free_stats(struct evlist *evlist);
void perf_evlist__reset_stats(struct evlist *evlist); void perf_evlist__reset_stats(struct evlist *evlist);
void perf_evlist__reset_prev_raw_counts(struct evlist *evlist); void perf_evlist__reset_prev_raw_counts(struct evlist *evlist);
void perf_evlist__copy_prev_raw_counts(struct evlist *evlist); void perf_evlist__copy_prev_raw_counts(struct evlist *evlist);
void perf_evlist__save_aggr_prev_raw_counts(struct evlist *evlist);
int perf_stat_process_counter(struct perf_stat_config *config, int perf_stat_process_counter(struct perf_stat_config *config,
struct evsel *counter); struct evsel *counter);
......
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