|
@@ -388,6 +388,26 @@ static void update_shadow_stats(struct perf_evsel *counter, u64 *count)
|
|
|
update_stats(&runtime_itlb_cache_stats[0], count[0]);
|
|
|
}
|
|
|
|
|
|
+static int read_cb(struct perf_evsel *evsel, int cpu, int thread __maybe_unused,
|
|
|
+ struct perf_counts_values *count)
|
|
|
+{
|
|
|
+ switch (aggr_mode) {
|
|
|
+ case AGGR_CORE:
|
|
|
+ case AGGR_SOCKET:
|
|
|
+ case AGGR_NONE:
|
|
|
+ perf_evsel__compute_deltas(evsel, cpu, count);
|
|
|
+ perf_counts_values__scale(count, scale, NULL);
|
|
|
+ evsel->counts->cpu[cpu] = *count;
|
|
|
+ update_shadow_stats(evsel, count->values);
|
|
|
+ break;
|
|
|
+ case AGGR_GLOBAL:
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Read out the results of a single counter:
|
|
|
* aggregate counts across CPUs in system-wide mode
|
|
@@ -424,16 +444,11 @@ static int read_counter_aggr(struct perf_evsel *counter)
|
|
|
*/
|
|
|
static int read_counter(struct perf_evsel *counter)
|
|
|
{
|
|
|
- u64 *count;
|
|
|
int cpu;
|
|
|
|
|
|
for (cpu = 0; cpu < perf_evsel__nr_cpus(counter); cpu++) {
|
|
|
- if (__perf_evsel__read_on_cpu(counter, cpu, 0, scale) < 0)
|
|
|
+ if (perf_evsel__read_cb(counter, cpu, 0, read_cb))
|
|
|
return -1;
|
|
|
-
|
|
|
- count = counter->counts->cpu[cpu].values;
|
|
|
-
|
|
|
- update_shadow_stats(counter, count);
|
|
|
}
|
|
|
|
|
|
return 0;
|