forked from luck/tmp_suning_uos_patched
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: Jin Yao <yao.jin@linux.intel.com> Reviewed-by: Jiri 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.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
297767ac0c
commit
905365f493
|
@ -249,6 +249,26 @@ void perf_evlist__copy_prev_raw_counts(struct evlist *evlist)
|
|||
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)
|
||||
{
|
||||
if (counter->per_pkg_mask)
|
||||
|
|
|
@ -199,6 +199,7 @@ void perf_evlist__free_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__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,
|
||||
struct evsel *counter);
|
||||
|
|
Loading…
Reference in New Issue
Block a user