perf stat: Rework header display
authorNamhyung Kim <namhyung@kernel.org>
Mon, 14 Nov 2022 23:02:22 +0000 (15:02 -0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 16 Nov 2022 12:51:23 +0000 (09:51 -0300)
There are print_header() and print_interval() to print header lines before
actual counter values.  Also print_metric_headers() needs to be called for
the metric-only case.

Let's move all these logics to a single place including num_print_iv to
refresh the headers for interval mode.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Athira Jajeev <atrajeev@linux.vnet.ibm.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Xing Zhengjun <zhengjun.xing@linux.intel.com>
Link: https://lore.kernel.org/r/20221114230227.1255976-15-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/stat-display.c

index cc8bb6d..f978176 100644 (file)
@@ -1034,94 +1034,129 @@ static void prepare_interval(struct perf_stat_config *config,
                                 ts->tv_sec, ts->tv_nsec);
 }
 
-static void print_interval(struct perf_stat_config *config,
-                          struct evlist *evlist)
+static void print_header_interval_std(struct perf_stat_config *config,
+                                     struct target *_target __maybe_unused,
+                                     struct evlist *evlist,
+                                     int argc __maybe_unused,
+                                     const char **argv __maybe_unused)
 {
-       bool metric_only = config->metric_only;
-       unsigned int unit_width = config->unit_width;
        FILE *output = config->output;
-       static int num_print_interval;
 
-       if (config->interval_clear && isatty(fileno(output)))
-               puts(CONSOLE_CLEAR);
+       switch (config->aggr_mode) {
+       case AGGR_NODE:
+       case AGGR_SOCKET:
+       case AGGR_DIE:
+       case AGGR_CORE:
+               fprintf(output, "#%*s %-*s cpus",
+                       INTERVAL_LEN - 1, "time",
+                       aggr_header_lens[config->aggr_mode],
+                       aggr_header_std[config->aggr_mode]);
+               break;
+       case AGGR_NONE:
+               fprintf(output, "#%*s %-*s",
+                       INTERVAL_LEN - 1, "time",
+                       aggr_header_lens[config->aggr_mode],
+                       aggr_header_std[config->aggr_mode]);
+               break;
+       case AGGR_THREAD:
+               fprintf(output, "#%*s %*s-%-*s",
+                       INTERVAL_LEN - 1, "time",
+                       COMM_LEN, "comm", PID_LEN, "pid");
+               break;
+       case AGGR_GLOBAL:
+       default:
+               if (!config->iostat_run)
+                       fprintf(output, "#%*s",
+                               INTERVAL_LEN - 1, "time");
+       case AGGR_UNSET:
+       case AGGR_MAX:
+               break;
+       }
 
-       if ((num_print_interval == 0 || config->interval_clear) &&
-                       !config->csv_output && !config->json_output) {
-               switch (config->aggr_mode) {
-               case AGGR_NODE:
-               case AGGR_SOCKET:
-               case AGGR_DIE:
-               case AGGR_CORE:
-                       fprintf(output, "#%*s %-*s cpus",
-                               INTERVAL_LEN - 1, "time",
-                               aggr_header_lens[config->aggr_mode],
-                               aggr_header_std[config->aggr_mode]);
-                       break;
-               case AGGR_NONE:
-                       fprintf(output, "#%*s %-*s",
-                               INTERVAL_LEN - 1, "time",
-                               aggr_header_lens[config->aggr_mode],
-                               aggr_header_std[config->aggr_mode]);
-                       break;
-               case AGGR_THREAD:
-                       fprintf(output, "#%*s %*s-%-*s",
-                               INTERVAL_LEN - 1, "time",
-                               COMM_LEN, "comm", PID_LEN, "pid");
-                       break;
-               case AGGR_GLOBAL:
-               default:
-                       if (!config->iostat_run)
-                               fprintf(output, "#%*s",
-                                       INTERVAL_LEN - 1, "time");
-               case AGGR_UNSET:
-               case AGGR_MAX:
-                       break;
-               }
+       if (config->metric_only)
+               print_metric_headers(config, evlist, " ", true);
+       else
+               fprintf(output, " %*s %*s events\n",
+                       COUNTS_LEN, "counts", config->unit_width, "unit");
+}
 
-               if (!metric_only) {
-                       fprintf(output, " %*s %*s events\n",
-                               COUNTS_LEN, "counts", unit_width, "unit");
-               }
-       }
+static void print_header_std(struct perf_stat_config *config,
+                            struct target *_target, struct evlist *evlist,
+                            int argc, const char **argv)
+{
+       FILE *output = config->output;
+       int i;
+
+       fprintf(output, "\n");
+       fprintf(output, " Performance counter stats for ");
+       if (_target->bpf_str)
+               fprintf(output, "\'BPF program(s) %s", _target->bpf_str);
+       else if (_target->system_wide)
+               fprintf(output, "\'system wide");
+       else if (_target->cpu_list)
+               fprintf(output, "\'CPU(s) %s", _target->cpu_list);
+       else if (!target__has_task(_target)) {
+               fprintf(output, "\'%s", argv ? argv[0] : "pipe");
+               for (i = 1; argv && (i < argc); i++)
+                       fprintf(output, " %s", argv[i]);
+       } else if (_target->pid)
+               fprintf(output, "process id \'%s", _target->pid);
+       else
+               fprintf(output, "thread id \'%s", _target->tid);
 
-       if ((num_print_interval == 0 || config->interval_clear) && metric_only)
+       fprintf(output, "\'");
+       if (config->run_count > 1)
+               fprintf(output, " (%d runs)", config->run_count);
+       fprintf(output, ":\n\n");
+
+       if (config->metric_only)
+               print_metric_headers(config, evlist, " ", false);
+}
+
+static void print_header_csv(struct perf_stat_config *config,
+                            struct target *_target __maybe_unused,
+                            struct evlist *evlist,
+                            int argc __maybe_unused,
+                            const char **argv __maybe_unused)
+{
+       if (config->metric_only)
+               print_metric_headers(config, evlist, " ", true);
+}
+static void print_header_json(struct perf_stat_config *config,
+                             struct target *_target __maybe_unused,
+                             struct evlist *evlist,
+                             int argc __maybe_unused,
+                             const char **argv __maybe_unused)
+{
+       if (config->metric_only)
                print_metric_headers(config, evlist, " ", true);
-       if (++num_print_interval == 25)
-               num_print_interval = 0;
 }
 
 static void print_header(struct perf_stat_config *config,
                         struct target *_target,
+                        struct evlist *evlist,
                         int argc, const char **argv)
 {
-       FILE *output = config->output;
-       int i;
+       static int num_print_iv;
 
        fflush(stdout);
 
-       if (!config->csv_output && !config->json_output) {
-               fprintf(output, "\n");
-               fprintf(output, " Performance counter stats for ");
-               if (_target->bpf_str)
-                       fprintf(output, "\'BPF program(s) %s", _target->bpf_str);
-               else if (_target->system_wide)
-                       fprintf(output, "\'system wide");
-               else if (_target->cpu_list)
-                       fprintf(output, "\'CPU(s) %s", _target->cpu_list);
-               else if (!target__has_task(_target)) {
-                       fprintf(output, "\'%s", argv ? argv[0] : "pipe");
-                       for (i = 1; argv && (i < argc); i++)
-                               fprintf(output, " %s", argv[i]);
-               } else if (_target->pid)
-                       fprintf(output, "process id \'%s", _target->pid);
-               else
-                       fprintf(output, "thread id \'%s", _target->tid);
+       if (config->interval_clear)
+               puts(CONSOLE_CLEAR);
 
-               fprintf(output, "\'");
-               if (config->run_count > 1)
-                       fprintf(output, " (%d runs)", config->run_count);
-               fprintf(output, ":\n\n");
+       if (num_print_iv == 0 || config->interval_clear) {
+               if (config->json_output)
+                       print_header_json(config, _target, evlist, argc, argv);
+               else if (config->csv_output)
+                       print_header_csv(config, _target, evlist, argc, argv);
+               else if (config->interval)
+                       print_header_interval_std(config, _target, evlist, argc, argv);
+               else
+                       print_header_std(config, _target, evlist, argc, argv);
        }
+
+       if (num_print_iv++ == 25)
+               num_print_iv = 0;
 }
 
 static int get_precision(double num)
@@ -1278,18 +1313,10 @@ void evlist__print_counters(struct evlist *evlist, struct perf_stat_config *conf
        if (interval) {
                prefix = buf;
                prepare_interval(config, prefix, ts);
-               print_interval(config, evlist);
-       } else {
-               print_header(config, _target, argc, argv);
        }
 
+       print_header(config, _target, evlist, argc, argv);
        if (metric_only) {
-               static int num_print_iv;
-
-               if (num_print_iv == 0 && !interval)
-                       print_metric_headers(config, evlist, prefix, false);
-               if (num_print_iv++ == 25)
-                       num_print_iv = 0;
                if (config->aggr_mode == AGGR_GLOBAL && prefix && !config->iostat_run)
                        fprintf(config->output, "%s", prefix);
        }