Merge tag 'dax-fixes-5.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdim...
[linux-2.6-microblaze.git] / tools / perf / util / stat-display.c
index 7f09cda..a76fff5 100644 (file)
@@ -17,6 +17,8 @@
 #include "cgroup.h"
 #include <api/fs/fs.h>
 #include "util.h"
+#include "iostat.h"
+#include "pmu-hybrid.h"
 
 #define CNTR_NOT_SUPPORTED     "<not supported>"
 #define CNTR_NOT_COUNTED       "<not counted>"
@@ -310,6 +312,11 @@ static void print_metric_header(struct perf_stat_config *config,
        struct outstate *os = ctx;
        char tbuf[1024];
 
+       /* In case of iostat, print metric header for first root port only */
+       if (config->iostat_run &&
+           os->evsel->priv != os->evsel->evlist->selected->priv)
+               return;
+
        if (!valid_only_metric(unit))
                return;
        unit = fixunit(tbuf, os->evsel, unit);
@@ -439,6 +446,12 @@ static void printout(struct perf_stat_config *config, struct aggr_cpu_id id, int
                if (counter->cgrp)
                        os.nfields++;
        }
+
+       if (!config->no_csv_summary && config->csv_output &&
+           config->summary && !config->interval) {
+               fprintf(config->output, "%16s%s", "summary", config->csv_sep);
+       }
+
        if (run == 0 || ena == 0 || counter->counts->scaled == -1) {
                if (config->metric_only) {
                        pm(config, &os, NULL, "", "", 0);
@@ -526,6 +539,7 @@ static void uniquify_event_name(struct evsel *counter)
 {
        char *new_name;
        char *config;
+       int ret = 0;
 
        if (counter->uniquified_name ||
            !counter->pmu_name || !strncmp(counter->name, counter->pmu_name,
@@ -540,8 +554,17 @@ static void uniquify_event_name(struct evsel *counter)
                        counter->name = new_name;
                }
        } else {
-               if (asprintf(&new_name,
-                            "%s [%s]", counter->name, counter->pmu_name) > 0) {
+               if (perf_pmu__has_hybrid()) {
+                       if (!counter->use_config_name) {
+                               ret = asprintf(&new_name, "%s/%s/",
+                                              counter->pmu_name, counter->name);
+                       }
+               } else {
+                       ret = asprintf(&new_name, "%s [%s]",
+                                      counter->name, counter->pmu_name);
+               }
+
+               if (ret) {
                        free(counter->name);
                        counter->name = new_name;
                }
@@ -644,6 +667,9 @@ static void print_counter_aggrdata(struct perf_stat_config *config,
        if (!collect_data(config, counter, aggr_cb, &ad))
                return;
 
+       if (perf_pmu__has_hybrid() && ad.ena == 0)
+               return;
+
        nr = ad.nr;
        ena = ad.ena;
        run = ad.run;
@@ -952,8 +978,11 @@ static void print_metric_headers(struct perf_stat_config *config,
        if (config->csv_output) {
                if (config->interval)
                        fputs("time,", config->output);
-               fputs(aggr_header_csv[config->aggr_mode], config->output);
+               if (!config->iostat_run)
+                       fputs(aggr_header_csv[config->aggr_mode], config->output);
        }
+       if (config->iostat_run)
+               iostat_print_header_prefix(config);
 
        /* Print metrics headers only */
        evlist__for_each_entry(evlist, counter) {
@@ -983,7 +1012,8 @@ static void print_interval(struct perf_stat_config *config,
        if (config->interval_clear)
                puts(CONSOLE_CLEAR);
 
-       sprintf(prefix, "%6lu.%09lu%s", (unsigned long) ts->tv_sec, ts->tv_nsec, config->csv_sep);
+       if (!config->iostat_run)
+               sprintf(prefix, "%6lu.%09lu%s", (unsigned long) ts->tv_sec, ts->tv_nsec, config->csv_sep);
 
        if ((num_print_interval == 0 && !config->csv_output) || config->interval_clear) {
                switch (config->aggr_mode) {
@@ -1019,9 +1049,11 @@ static void print_interval(struct perf_stat_config *config,
                        break;
                case AGGR_GLOBAL:
                default:
-                       fprintf(output, "#           time");
-                       if (!metric_only)
-                               fprintf(output, "             counts %*s events\n", unit_width, "unit");
+                       if (!config->iostat_run) {
+                               fprintf(output, "#           time");
+                               if (!metric_only)
+                                       fprintf(output, "             counts %*s events\n", unit_width, "unit");
+                       }
                case AGGR_UNSET:
                        break;
                }
@@ -1214,6 +1246,9 @@ void evlist__print_counters(struct evlist *evlist, struct perf_stat_config *conf
        struct evsel *counter;
        char buf[64], *prefix = NULL;
 
+       if (config->iostat_run)
+               evlist->selected = evlist__first(evlist);
+
        if (interval)
                print_interval(config, evlist, prefix = buf, ts);
        else
@@ -1226,7 +1261,7 @@ void evlist__print_counters(struct evlist *evlist, struct perf_stat_config *conf
                        print_metric_headers(config, evlist, prefix, false);
                if (num_print_iv++ == 25)
                        num_print_iv = 0;
-               if (config->aggr_mode == AGGR_GLOBAL && prefix)
+               if (config->aggr_mode == AGGR_GLOBAL && prefix && !config->iostat_run)
                        fprintf(config->output, "%s", prefix);
        }
 
@@ -1243,11 +1278,16 @@ void evlist__print_counters(struct evlist *evlist, struct perf_stat_config *conf
                }
                break;
        case AGGR_GLOBAL:
-               evlist__for_each_entry(evlist, counter) {
-                       print_counter_aggr(config, counter, prefix);
+               if (config->iostat_run)
+                       iostat_print_counters(evlist, config, ts, prefix = buf,
+                                             print_counter_aggr);
+               else {
+                       evlist__for_each_entry(evlist, counter) {
+                               print_counter_aggr(config, counter, prefix);
+                       }
+                       if (metric_only)
+                               fputc('\n', config->output);
                }
-               if (metric_only)
-                       fputc('\n', config->output);
                break;
        case AGGR_NONE:
                if (metric_only)