|
@@ -214,8 +214,13 @@ static inline void diff_timespec(struct timespec *r, struct timespec *a,
|
|
|
|
|
|
static void perf_stat__reset_stats(void)
|
|
static void perf_stat__reset_stats(void)
|
|
{
|
|
{
|
|
|
|
+ int i;
|
|
|
|
+
|
|
perf_evlist__reset_stats(evsel_list);
|
|
perf_evlist__reset_stats(evsel_list);
|
|
perf_stat__reset_shadow_stats();
|
|
perf_stat__reset_shadow_stats();
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < stat_config.stats_num; i++)
|
|
|
|
+ perf_stat__reset_shadow_per_stat(&stat_config.stats[i]);
|
|
}
|
|
}
|
|
|
|
|
|
static int create_perf_stat_counter(struct perf_evsel *evsel)
|
|
static int create_perf_stat_counter(struct perf_evsel *evsel)
|
|
@@ -2495,6 +2500,35 @@ int process_cpu_map_event(struct perf_tool *tool,
|
|
return set_maps(st);
|
|
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]);
|
|
|
|
+
|
|
|
|
+ free(config->stats);
|
|
|
|
+}
|
|
|
|
+
|
|
static const char * const stat_report_usage[] = {
|
|
static const char * const stat_report_usage[] = {
|
|
"perf stat report [<options>]",
|
|
"perf stat report [<options>]",
|
|
NULL,
|
|
NULL,
|
|
@@ -2750,8 +2784,15 @@ int cmd_stat(int argc, const char **argv)
|
|
* Initialize thread_map with comm names,
|
|
* Initialize thread_map with comm names,
|
|
* so we could print it out on output.
|
|
* so we could print it out on output.
|
|
*/
|
|
*/
|
|
- if (stat_config.aggr_mode == AGGR_THREAD)
|
|
|
|
|
|
+ if (stat_config.aggr_mode == AGGR_THREAD) {
|
|
thread_map__read_comms(evsel_list->threads);
|
|
thread_map__read_comms(evsel_list->threads);
|
|
|
|
+ if (target.system_wide) {
|
|
|
|
+ if (runtime_stat_new(&stat_config,
|
|
|
|
+ thread_map__nr(evsel_list->threads))) {
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
if (interval && interval < 100) {
|
|
if (interval && interval < 100) {
|
|
if (interval < 10) {
|
|
if (interval < 10) {
|
|
@@ -2841,5 +2882,8 @@ out:
|
|
sysfs__write_int(FREEZE_ON_SMI_PATH, 0);
|
|
sysfs__write_int(FREEZE_ON_SMI_PATH, 0);
|
|
|
|
|
|
perf_evlist__delete(evsel_list);
|
|
perf_evlist__delete(evsel_list);
|
|
|
|
+
|
|
|
|
+ runtime_stat_delete(&stat_config);
|
|
|
|
+
|
|
return status;
|
|
return status;
|
|
}
|
|
}
|