Lines Matching +full:static +full:- +full:config
40 static int aggr_header_lens[] = {
52 static const char *aggr_header_csv[] = {
59 [AGGR_THREAD] = "comm-pid,",
64 static const char *aggr_header_std[] = {
71 [AGGR_THREAD] = "comm-pid",
85 static_assert(ARRAY_SIZE(colors) - 1 == METRIC_THRESHOLD_GOOD, "missing enum value"); in metric_threshold_classify__color()
89 static const char *metric_threshold_classify__str(enum metric_threshold_classify thresh) in metric_threshold_classify__str()
98 static_assert(ARRAY_SIZE(strs) - 1 == METRIC_THRESHOLD_GOOD, "missing enum value"); in metric_threshold_classify__str()
102 static void print_running_std(struct perf_stat_config *config, u64 run, u64 ena) in print_running_std() argument
105 fprintf(config->output, " (%.2f%%)", 100.0 * run / ena); in print_running_std()
108 static void print_running_csv(struct perf_stat_config *config, u64 run, u64 ena) in print_running_csv() argument
114 fprintf(config->output, "%s%" PRIu64 "%s%.2f", in print_running_csv()
115 config->csv_sep, run, config->csv_sep, enabled_percent); in print_running_csv()
132 /* Lines are timestamped in --interval-print mode */
144 static const char *json_sep(struct outstate *os) in json_sep()
146 const char *sep = os->first ? "" : ", "; in json_sep()
148 os->first = false; in json_sep()
152 #define json_out(os, format, ...) fprintf((os)->fh, "%s" format, json_sep(os), ##__VA_ARGS__)
154 static void print_running_json(struct outstate *os, u64 run, u64 ena) in print_running_json()
160 json_out(os, "\"event-runtime\" : %" PRIu64 ", \"pcnt-running\" : %.2f", in print_running_json()
164 static void print_running(struct perf_stat_config *config, struct outstate *os, in print_running() argument
167 if (config->json_output) { in print_running()
170 } else if (config->csv_output) { in print_running()
172 print_running_csv(config, run, ena); in print_running()
175 print_running_std(config, run, ena); in print_running()
179 static void print_noise_pct_std(struct perf_stat_config *config, in print_noise_pct_std() argument
183 fprintf(config->output, " ( +-%6.2f%% )", pct); in print_noise_pct_std()
186 static void print_noise_pct_csv(struct perf_stat_config *config, in print_noise_pct_csv() argument
189 fprintf(config->output, "%s%.2f%%", config->csv_sep, pct); in print_noise_pct_csv()
192 static void print_noise_pct_json(struct outstate *os, in print_noise_pct_json()
198 static void print_noise_pct(struct perf_stat_config *config, struct outstate *os, in print_noise_pct() argument
203 if (config->json_output) { in print_noise_pct()
206 } else if (config->csv_output) { in print_noise_pct()
208 print_noise_pct_csv(config, pct); in print_noise_pct()
211 print_noise_pct_std(config, pct); in print_noise_pct()
215 static void print_noise(struct perf_stat_config *config, struct outstate *os, in print_noise() argument
220 if (config->run_count == 1) in print_noise()
223 ps = evsel->stats; in print_noise()
224 print_noise_pct(config, os, stddev_stats(&ps->res_stats), avg, before_metric); in print_noise()
227 static void print_cgroup_std(struct perf_stat_config *config, const char *cgrp_name) in print_cgroup_std() argument
229 fprintf(config->output, " %-*s", CGROUP_LEN, cgrp_name); in print_cgroup_std()
232 static void print_cgroup_csv(struct perf_stat_config *config, const char *cgrp_name) in print_cgroup_csv() argument
234 fprintf(config->output, "%s%s", config->csv_sep, cgrp_name); in print_cgroup_csv()
237 static void print_cgroup_json(struct outstate *os, const char *cgrp_name) in print_cgroup_json()
242 static void print_cgroup(struct perf_stat_config *config, struct outstate *os, in print_cgroup() argument
245 if (nr_cgroups || config->cgroup_list) { in print_cgroup()
246 const char *cgrp_name = cgrp ? cgrp->name : ""; in print_cgroup()
248 if (config->json_output) in print_cgroup()
250 else if (config->csv_output) in print_cgroup()
251 print_cgroup_csv(config, cgrp_name); in print_cgroup()
253 print_cgroup_std(config, cgrp_name); in print_cgroup()
257 static void print_aggr_id_std(struct perf_stat_config *config, in print_aggr_id_std() argument
260 FILE *output = config->output; in print_aggr_id_std()
261 int idx = config->aggr_mode; in print_aggr_id_std()
264 switch (config->aggr_mode) { in print_aggr_id_std()
266 snprintf(buf, sizeof(buf), "S%d-D%d-C%d", id.socket, id.die, id.core); in print_aggr_id_std()
269 snprintf(buf, sizeof(buf), "S%d-D%d-L%d-ID%d", in print_aggr_id_std()
273 snprintf(buf, sizeof(buf), "S%d-D%d-CLS%d", id.socket, id.die, id.cluster); in print_aggr_id_std()
276 snprintf(buf, sizeof(buf), "S%d-D%d", id.socket, id.die); in print_aggr_id_std()
285 if (evsel->percore && !config->percore_show_thread) { in print_aggr_id_std()
286 snprintf(buf, sizeof(buf), "S%d-D%d-C%d ", in print_aggr_id_std()
288 fprintf(output, "%-*s ", in print_aggr_id_std()
290 } else if (id.cpu.cpu > -1) { in print_aggr_id_std()
291 fprintf(output, "CPU%-*d ", in print_aggr_id_std()
292 aggr_header_lens[AGGR_NONE] - 3, id.cpu.cpu); in print_aggr_id_std()
296 fprintf(output, "%*s-%-*d ", in print_aggr_id_std()
297 COMM_LEN, perf_thread_map__comm(evsel->core.threads, id.thread_idx), in print_aggr_id_std()
298 PID_LEN, perf_thread_map__pid(evsel->core.threads, id.thread_idx)); in print_aggr_id_std()
307 fprintf(output, "%-*s %*d ", aggr_header_lens[idx], buf, /*strlen("ctrs")*/ 4, aggr_nr); in print_aggr_id_std()
310 static void print_aggr_id_csv(struct perf_stat_config *config, in print_aggr_id_csv() argument
313 FILE *output = config->output; in print_aggr_id_csv()
314 const char *sep = config->csv_sep; in print_aggr_id_csv()
316 switch (config->aggr_mode) { in print_aggr_id_csv()
318 fprintf(output, "S%d-D%d-C%d%s%d%s", in print_aggr_id_csv()
322 fprintf(config->output, "S%d-D%d-L%d-ID%d%s%d%s", in print_aggr_id_csv()
326 fprintf(config->output, "S%d-D%d-CLS%d%s%d%s", in print_aggr_id_csv()
330 fprintf(output, "S%d-D%d%s%d%s", in print_aggr_id_csv()
342 if (evsel->percore && !config->percore_show_thread) { in print_aggr_id_csv()
343 fprintf(output, "S%d-D%d-C%d%s", in print_aggr_id_csv()
345 } else if (id.cpu.cpu > -1) { in print_aggr_id_csv()
351 fprintf(output, "%s-%d%s", in print_aggr_id_csv()
352 perf_thread_map__comm(evsel->core.threads, id.thread_idx), in print_aggr_id_csv()
353 perf_thread_map__pid(evsel->core.threads, id.thread_idx), in print_aggr_id_csv()
364 static void print_aggr_id_json(struct perf_stat_config *config, struct outstate *os, in print_aggr_id_json() argument
367 switch (config->aggr_mode) { in print_aggr_id_json()
369 json_out(os, "\"core\" : \"S%d-D%d-C%d\", \"counters\" : %d", in print_aggr_id_json()
373 json_out(os, "\"cache\" : \"S%d-D%d-L%d-ID%d\", \"counters\" : %d", in print_aggr_id_json()
377 json_out(os, "\"cluster\" : \"S%d-D%d-CLS%d\", \"counters\" : %d", in print_aggr_id_json()
381 json_out(os, "\"die\" : \"S%d-D%d\", \"counters\" : %d", in print_aggr_id_json()
393 if (evsel->percore && !config->percore_show_thread) { in print_aggr_id_json()
394 json_out(os, "\"core\" : \"S%d-D%d-C%d\"", in print_aggr_id_json()
396 } else if (id.cpu.cpu > -1) { in print_aggr_id_json()
402 json_out(os, "\"thread\" : \"%s-%d\"", in print_aggr_id_json()
403 perf_thread_map__comm(evsel->core.threads, id.thread_idx), in print_aggr_id_json()
404 perf_thread_map__pid(evsel->core.threads, id.thread_idx)); in print_aggr_id_json()
414 static void aggr_printout(struct perf_stat_config *config, struct outstate *os, in aggr_printout() argument
417 if (config->json_output) in aggr_printout()
418 print_aggr_id_json(config, os, evsel, id, aggr_nr); in aggr_printout()
419 else if (config->csv_output) in aggr_printout()
420 print_aggr_id_csv(config, evsel, id, aggr_nr); in aggr_printout()
422 print_aggr_id_std(config, evsel, id, aggr_nr); in aggr_printout()
425 static void new_line_std(struct perf_stat_config *config __maybe_unused, in new_line_std()
430 os->newline = true; in new_line_std()
433 static inline void __new_line_std_csv(struct perf_stat_config *config, in __new_line_std_csv() argument
436 fputc('\n', os->fh); in __new_line_std_csv()
437 if (config->interval) in __new_line_std_csv()
438 fputs(os->timestamp, os->fh); in __new_line_std_csv()
439 aggr_printout(config, os, os->evsel, os->id, os->aggr_nr); in __new_line_std_csv()
442 static inline void __new_line_std(struct outstate *os) in __new_line_std()
444 fprintf(os->fh, " "); in __new_line_std()
447 static void do_new_line_std(struct perf_stat_config *config, in do_new_line_std() argument
450 __new_line_std_csv(config, os); in do_new_line_std()
451 if (config->aggr_mode == AGGR_NONE) in do_new_line_std()
452 fprintf(os->fh, " "); in do_new_line_std()
456 static void print_metric_std(struct perf_stat_config *config, in print_metric_std() argument
461 FILE *out = os->fh; in print_metric_std()
463 bool newline = os->newline; in print_metric_std()
466 os->newline = false; in print_metric_std()
469 fprintf(out, "%-*s", METRIC_LEN, ""); in print_metric_std()
474 do_new_line_std(config, os); in print_metric_std()
481 fprintf(out, " %-*s", METRIC_LEN - n - 1, unit); in print_metric_std()
484 static void new_line_csv(struct perf_stat_config *config, void *ctx) in new_line_csv() argument
489 __new_line_std_csv(config, os); in new_line_csv()
490 for (i = 0; i < os->csv_col_pad; i++) in new_line_csv()
491 fputs(config->csv_sep, os->fh); in new_line_csv()
494 static void print_metric_csv(struct perf_stat_config *config __maybe_unused, in print_metric_csv()
500 FILE *out = os->fh; in print_metric_csv()
504 fprintf(out, "%s%s", config->csv_sep, config->csv_sep); in print_metric_csv()
512 fprintf(out, "%s%s%s%s", config->csv_sep, vals, config->csv_sep, skip_spaces(unit)); in print_metric_csv()
515 static void print_metric_json(struct perf_stat_config *config __maybe_unused, in print_metric_json()
522 FILE *out = os->fh; in print_metric_json()
525 json_out(os, "\"metric-value\" : \"%f\", \"metric-unit\" : \"%s\"", val, unit); in print_metric_json()
527 json_out(os, "\"metric-threshold\" : \"%s\"", in print_metric_json()
531 if (!config->metric_only) in print_metric_json()
535 static void new_line_json(struct perf_stat_config *config, void *ctx) in new_line_json() argument
539 fputs("\n{", os->fh); in new_line_json()
540 os->first = true; in new_line_json()
541 if (config->interval) in new_line_json()
542 json_out(os, "%s", os->timestamp); in new_line_json()
544 aggr_printout(config, os, os->evsel, os->id, os->aggr_nr); in new_line_json()
547 static void print_metricgroup_header_json(struct perf_stat_config *config, in print_metricgroup_header_json() argument
555 new_line_json(config, ctx); in print_metricgroup_header_json()
558 static void print_metricgroup_header_csv(struct perf_stat_config *config, in print_metricgroup_header_csv() argument
567 for (i = 0; i < os->csv_col_pad - 2; i++) in print_metricgroup_header_csv()
568 fputs(config->csv_sep, os->fh); in print_metricgroup_header_csv()
572 for (i = 0; i < os->csv_col_pad; i++) in print_metricgroup_header_csv()
573 fputs(config->csv_sep, os->fh); in print_metricgroup_header_csv()
574 fprintf(config->output, "%s", metricgroup_name); in print_metricgroup_header_csv()
575 new_line_csv(config, ctx); in print_metricgroup_header_csv()
578 static void print_metricgroup_header_std(struct perf_stat_config *config, in print_metricgroup_header_std() argument
590 n = fprintf(config->output, " %*s", EVNAME_LEN, metricgroup_name); in print_metricgroup_header_std()
592 fprintf(config->output, "%*s", MGROUP_LEN - n - 1, ""); in print_metricgroup_header_std()
597 static bool valid_only_metric(const char *unit) in valid_only_metric()
607 static const char *fixunit(char *buf, struct evsel *evsel, in fixunit()
618 static void print_metric_only(struct perf_stat_config *config, in print_metric_only() argument
623 FILE *out = os->fh; in print_metric_only()
625 unsigned mlen = config->metric_only_len; in print_metric_only()
630 unit = fixunit(buf, os->evsel, unit); in print_metric_only()
635 mlen += strlen(color) + sizeof(PERF_COLOR_RESET) - 1; in print_metric_only()
639 os->first = false; in print_metric_only()
642 static void print_metric_only_csv(struct perf_stat_config *config __maybe_unused, in print_metric_only_csv()
649 FILE *out = os->fh; in print_metric_only_csv()
655 unit = fixunit(tbuf, os->evsel, unit); in print_metric_only_csv()
661 fprintf(out, "%s%s", vals, config->csv_sep); in print_metric_only_csv()
662 os->first = false; in print_metric_only_csv()
665 static void print_metric_only_json(struct perf_stat_config *config __maybe_unused, in print_metric_only_json()
678 unit = fixunit(tbuf, os->evsel, unit); in print_metric_only_json()
691 static void print_metric_header(struct perf_stat_config *config, in print_metric_header() argument
701 if (config->iostat_run && in print_metric_header()
702 os->evsel->priv != os->evsel->evlist->selected->priv) in print_metric_header()
705 if (os->evsel->cgrp != os->cgrp) in print_metric_header()
710 unit = fixunit(tbuf, os->evsel, unit); in print_metric_header()
712 if (config->json_output) in print_metric_header()
714 else if (config->csv_output) in print_metric_header()
715 fprintf(os->fh, "%s%s", unit, config->csv_sep); in print_metric_header()
717 fprintf(os->fh, "%*s ", config->metric_only_len, unit); in print_metric_header()
720 static void print_counter_value_std(struct perf_stat_config *config, in print_counter_value_std() argument
723 FILE *output = config->output; in print_counter_value_std()
724 double sc = evsel->scale; in print_counter_value_std()
726 const char *bad_count = evsel->supported ? CNTR_NOT_COUNTED : CNTR_NOT_SUPPORTED; in print_counter_value_std()
728 if (config->big_num) in print_counter_value_std()
738 if (evsel->unit) in print_counter_value_std()
739 fprintf(output, "%-*s ", config->unit_width, evsel->unit); in print_counter_value_std()
741 fprintf(output, "%-*s", EVNAME_LEN, evsel__name(evsel)); in print_counter_value_std()
744 static void print_counter_value_csv(struct perf_stat_config *config, in print_counter_value_csv() argument
747 FILE *output = config->output; in print_counter_value_csv()
748 double sc = evsel->scale; in print_counter_value_csv()
749 const char *sep = config->csv_sep; in print_counter_value_csv()
751 const char *bad_count = evsel->supported ? CNTR_NOT_COUNTED : CNTR_NOT_SUPPORTED; in print_counter_value_csv()
758 if (evsel->unit) in print_counter_value_csv()
759 fprintf(output, "%s%s", evsel->unit, sep); in print_counter_value_csv()
764 static void print_counter_value_json(struct outstate *os, in print_counter_value_json()
767 const char *bad_count = evsel->supported ? CNTR_NOT_COUNTED : CNTR_NOT_SUPPORTED; in print_counter_value_json()
770 json_out(os, "\"counter-value\" : \"%f\"", avg); in print_counter_value_json()
772 json_out(os, "\"counter-value\" : \"%s\"", bad_count); in print_counter_value_json()
774 if (evsel->unit) in print_counter_value_json()
775 json_out(os, "\"unit\" : \"%s\"", evsel->unit); in print_counter_value_json()
780 static void print_counter_value(struct perf_stat_config *config, struct outstate *os, in print_counter_value() argument
783 if (config->json_output) in print_counter_value()
785 else if (config->csv_output) in print_counter_value()
786 print_counter_value_csv(config, evsel, avg, ok); in print_counter_value()
788 print_counter_value_std(config, evsel, avg, ok); in print_counter_value()
791 static void abs_printout(struct perf_stat_config *config, in abs_printout() argument
796 aggr_printout(config, os, evsel, id, aggr_nr); in abs_printout()
797 print_counter_value(config, os, evsel, avg, ok); in abs_printout()
798 print_cgroup(config, os, evsel->cgrp); in abs_printout()
801 static bool evlist__has_hybrid_pmus(struct evlist *evlist) in evlist__has_hybrid_pmus()
810 if (evsel->core.is_pmu_core) { in evlist__has_hybrid_pmus()
828 static void printout(struct perf_stat_config *config, struct outstate *os, in printout() argument
836 struct evsel *counter = os->evsel; in printout()
838 if (config->csv_output) { in printout()
839 pm = config->metric_only ? print_metric_only_csv : print_metric_csv; in printout()
840 nl = config->metric_only ? NULL : new_line_csv; in printout()
842 os->csv_col_pad = 4 + (counter->cgrp ? 1 : 0); in printout()
843 } else if (config->json_output) { in printout()
844 pm = config->metric_only ? print_metric_only_json : print_metric_json; in printout()
845 nl = config->metric_only ? NULL : new_line_json; in printout()
848 pm = config->metric_only ? print_metric_only : print_metric_std; in printout()
849 nl = config->metric_only ? NULL : new_line_std; in printout()
853 if (run == 0 || ena == 0 || counter->counts->scaled == -1) { in printout()
854 if (config->metric_only) { in printout()
855 pm(config, os, METRIC_THRESHOLD_UNKNOWN, /*format=*/NULL, in printout()
862 if (counter->supported) { in printout()
863 if (!evlist__has_hybrid_pmus(counter->evlist)) { in printout()
864 config->print_free_counters_hint = 1; in printout()
875 if (!config->metric_only && !counter->default_metricgroup) { in printout()
876 abs_printout(config, os, os->id, os->aggr_nr, counter, uval, ok); in printout()
878 print_noise(config, os, counter, noise, /*before_metric=*/true); in printout()
879 print_running(config, os, run, ena, /*before_metric=*/true); in printout()
883 if (!config->metric_only && counter->default_metricgroup) { in printout()
886 aggr_printout(config, os, os->evsel, os->id, os->aggr_nr); in printout()
893 if (config->json_output) in printout()
894 new_line_json(config, (void *)os); in printout()
896 __new_line_std_csv(config, os); in printout()
899 print_noise(config, os, counter, noise, /*before_metric=*/true); in printout()
900 print_running(config, os, run, ena, /*before_metric=*/true); in printout()
901 from = perf_stat__print_shadow_stats_metricgroup(config, counter, aggr_idx, in printout()
905 perf_stat__print_shadow_stats(config, counter, uval, aggr_idx, &out); in printout()
908 pm(config, os, METRIC_THRESHOLD_UNKNOWN, /*format=*/NULL, /*unit=*/NULL, /*val=*/0); in printout()
911 if (!config->metric_only) { in printout()
912 print_noise(config, os, counter, noise, /*before_metric=*/false); in printout()
913 print_running(config, os, run, ena, /*before_metric=*/false); in printout()
918 * should_skip_zero_count() - Check if the event should print 0 values.
919 * @config: The perf stat configuration (including aggregation mode).
923 * Due to mismatch between the event cpumap or thread-map and the
933 static bool should_skip_zero_counter(struct perf_stat_config *config, in should_skip_zero_counter() argument
944 if (verbose == 0 && counter->skippable && !counter->supported) in should_skip_zero_counter()
948 * Skip value 0 when enabling --per-thread globally, in should_skip_zero_counter()
951 if (config->aggr_mode == AGGR_THREAD && config->system_wide) in should_skip_zero_counter()
955 * In per-thread mode the aggr_map and aggr_get_id functions may be in should_skip_zero_counter()
958 if (!config->aggr_map || !config->aggr_get_id) in should_skip_zero_counter()
968 config->aggr_get_id(config, (struct perf_cpu){ .cpu = 0 }); in should_skip_zero_counter()
977 perf_cpu_map__for_each_cpu(cpu, idx, counter->core.cpus) { in should_skip_zero_counter()
978 struct aggr_cpu_id own_id = config->aggr_get_id(config, cpu); in should_skip_zero_counter()
986 static void print_counter_aggrdata(struct perf_stat_config *config, in print_counter_aggrdata() argument
990 FILE *output = config->output; in print_counter_aggrdata()
993 struct perf_stat_evsel *ps = counter->stats; in print_counter_aggrdata()
994 struct perf_stat_aggr *aggr = &ps->aggr[aggr_idx]; in print_counter_aggrdata()
995 struct aggr_cpu_id id = config->aggr_map->map[aggr_idx]; in print_counter_aggrdata()
996 double avg = aggr->counts.val; in print_counter_aggrdata()
997 bool metric_only = config->metric_only; in print_counter_aggrdata()
999 os->id = id; in print_counter_aggrdata()
1000 os->aggr_nr = aggr->nr; in print_counter_aggrdata()
1001 os->evsel = counter; in print_counter_aggrdata()
1004 if (config->aggr_mode != AGGR_NONE) { in print_counter_aggrdata()
1006 if (config->hybrid_merge && counter->first_wildcard_match != NULL) in print_counter_aggrdata()
1009 if (counter->first_wildcard_match != NULL) in print_counter_aggrdata()
1014 val = aggr->counts.val; in print_counter_aggrdata()
1015 ena = aggr->counts.ena; in print_counter_aggrdata()
1016 run = aggr->counts.run; in print_counter_aggrdata()
1021 if (val == 0 && should_skip_zero_counter(config, counter, &id)) in print_counter_aggrdata()
1025 if (config->json_output) { in print_counter_aggrdata()
1026 os->first = true; in print_counter_aggrdata()
1029 if (config->interval) { in print_counter_aggrdata()
1030 if (config->json_output) in print_counter_aggrdata()
1031 json_out(os, "%s", os->timestamp); in print_counter_aggrdata()
1033 fprintf(output, "%s", os->timestamp); in print_counter_aggrdata()
1034 } else if (config->summary && config->csv_output && in print_counter_aggrdata()
1035 !config->no_csv_summary) in print_counter_aggrdata()
1036 fprintf(output, "%s%s", "summary", config->csv_sep); in print_counter_aggrdata()
1039 uval = val * counter->scale; in print_counter_aggrdata()
1041 printout(config, os, uval, run, ena, avg, aggr_idx); in print_counter_aggrdata()
1047 static void print_metric_begin(struct perf_stat_config *config, in print_metric_begin() argument
1055 os->first = true; in print_metric_begin()
1056 if (!config->metric_only) in print_metric_begin()
1059 if (config->json_output) in print_metric_begin()
1060 fputc('{', config->output); in print_metric_begin()
1062 if (config->interval) { in print_metric_begin()
1063 if (config->json_output) in print_metric_begin()
1064 json_out(os, "%s", os->timestamp); in print_metric_begin()
1066 fprintf(config->output, "%s", os->timestamp); in print_metric_begin()
1069 id = config->aggr_map->map[aggr_idx]; in print_metric_begin()
1070 aggr = &evsel->stats->aggr[aggr_idx]; in print_metric_begin()
1071 aggr_printout(config, os, evsel, id, aggr->nr); in print_metric_begin()
1073 print_cgroup(config, os, os->cgrp ? : evsel->cgrp); in print_metric_begin()
1076 static void print_metric_end(struct perf_stat_config *config, struct outstate *os) in print_metric_end() argument
1078 FILE *output = config->output; in print_metric_end()
1080 if (!config->metric_only) in print_metric_end()
1083 if (config->json_output) { in print_metric_end()
1084 if (os->first) in print_metric_end()
1085 fputs("\"metric-value\" : \"none\"", output); in print_metric_end()
1091 static void print_aggr(struct perf_stat_config *config, in print_aggr() argument
1098 if (!config->aggr_map || !config->aggr_get_id) in print_aggr()
1105 cpu_aggr_map__for_each_idx(aggr_idx, config->aggr_map) { in print_aggr()
1106 print_metric_begin(config, evlist, os, aggr_idx); in print_aggr()
1109 print_counter_aggrdata(config, counter, aggr_idx, os); in print_aggr()
1111 print_metric_end(config, os); in print_aggr()
1115 static void print_aggr_cgroup(struct perf_stat_config *config, in print_aggr_cgroup() argument
1122 if (!config->aggr_map || !config->aggr_get_id) in print_aggr_cgroup()
1126 if (os->cgrp == evsel->cgrp) in print_aggr_cgroup()
1129 os->cgrp = evsel->cgrp; in print_aggr_cgroup()
1131 cpu_aggr_map__for_each_idx(aggr_idx, config->aggr_map) { in print_aggr_cgroup()
1132 print_metric_begin(config, evlist, os, aggr_idx); in print_aggr_cgroup()
1135 if (counter->cgrp != os->cgrp) in print_aggr_cgroup()
1138 print_counter_aggrdata(config, counter, aggr_idx, os); in print_aggr_cgroup()
1140 print_metric_end(config, os); in print_aggr_cgroup()
1145 static void print_counter(struct perf_stat_config *config, in print_counter() argument
1150 /* AGGR_THREAD doesn't have config->aggr_get_id */ in print_counter()
1151 if (!config->aggr_map) in print_counter()
1154 cpu_aggr_map__for_each_idx(aggr_idx, config->aggr_map) { in print_counter()
1155 print_counter_aggrdata(config, counter, aggr_idx, os); in print_counter()
1159 static void print_no_aggr_metric(struct perf_stat_config *config, in print_no_aggr_metric() argument
1166 perf_cpu_map__for_each_cpu(cpu, all_idx, evlist->core.user_requested_cpus) { in print_no_aggr_metric()
1173 struct perf_stat_evsel *ps = counter->stats; in print_no_aggr_metric()
1179 cpu_aggr_map__for_each_idx(aggr_idx, config->aggr_map) { in print_no_aggr_metric()
1180 if (config->aggr_map->map[aggr_idx].cpu.cpu == cpu.cpu) in print_no_aggr_metric()
1184 os->evsel = counter; in print_no_aggr_metric()
1185 os->id = aggr_cpu_id__cpu(cpu, /*data=*/NULL); in print_no_aggr_metric()
1187 print_metric_begin(config, evlist, os, aggr_idx); in print_no_aggr_metric()
1190 val = ps->aggr[aggr_idx].counts.val; in print_no_aggr_metric()
1191 ena = ps->aggr[aggr_idx].counts.ena; in print_no_aggr_metric()
1192 run = ps->aggr[aggr_idx].counts.run; in print_no_aggr_metric()
1194 uval = val * counter->scale; in print_no_aggr_metric()
1195 printout(config, os, uval, run, ena, 1.0, aggr_idx); in print_no_aggr_metric()
1198 print_metric_end(config, os); in print_no_aggr_metric()
1202 static void print_metric_headers_std(struct perf_stat_config *config, in print_metric_headers_std() argument
1205 fputc(' ', config->output); in print_metric_headers_std()
1208 int len = aggr_header_lens[config->aggr_mode]; in print_metric_headers_std()
1210 if (nr_cgroups || config->cgroup_list) in print_metric_headers_std()
1213 fprintf(config->output, "%*s", len, ""); in print_metric_headers_std()
1217 static void print_metric_headers_csv(struct perf_stat_config *config, in print_metric_headers_csv() argument
1222 if (config->interval) in print_metric_headers_csv()
1223 fprintf(config->output, "time%s", config->csv_sep); in print_metric_headers_csv()
1224 if (config->iostat_run) in print_metric_headers_csv()
1227 p = aggr_header_csv[config->aggr_mode]; in print_metric_headers_csv()
1230 fputs(config->csv_sep, config->output); in print_metric_headers_csv()
1232 fputc(*p, config->output); in print_metric_headers_csv()
1237 static void print_metric_headers_json(struct perf_stat_config *config __maybe_unused, in print_metric_headers_json()
1242 static void print_metric_headers(struct perf_stat_config *config, in print_metric_headers() argument
1247 .fh = config->output in print_metric_headers()
1256 if (config->json_output) in print_metric_headers()
1257 print_metric_headers_json(config, no_indent); in print_metric_headers()
1258 else if (config->csv_output) in print_metric_headers()
1259 print_metric_headers_csv(config, no_indent); in print_metric_headers()
1261 print_metric_headers_std(config, no_indent); in print_metric_headers()
1263 if (config->iostat_run) in print_metric_headers()
1264 iostat_print_header_prefix(config); in print_metric_headers()
1266 if (config->cgroup_list) in print_metric_headers()
1267 os.cgrp = evlist__first(evlist)->cgrp; in print_metric_headers()
1271 if (!config->iostat_run && in print_metric_headers()
1272 config->aggr_mode != AGGR_NONE && counter->metric_leader != counter) in print_metric_headers()
1277 perf_stat__print_shadow_stats(config, counter, 0, 0, &out); in print_metric_headers()
1280 if (!config->json_output) in print_metric_headers()
1281 fputc('\n', config->output); in print_metric_headers()
1284 static void prepare_timestamp(struct perf_stat_config *config, in prepare_timestamp() argument
1287 if (config->iostat_run) in prepare_timestamp()
1290 if (config->json_output) in prepare_timestamp()
1291 scnprintf(os->timestamp, sizeof(os->timestamp), "\"interval\" : %lu.%09lu", in prepare_timestamp()
1292 (unsigned long) ts->tv_sec, ts->tv_nsec); in prepare_timestamp()
1293 else if (config->csv_output) in prepare_timestamp()
1294 scnprintf(os->timestamp, sizeof(os->timestamp), "%lu.%09lu%s", in prepare_timestamp()
1295 (unsigned long) ts->tv_sec, ts->tv_nsec, config->csv_sep); in prepare_timestamp()
1297 scnprintf(os->timestamp, sizeof(os->timestamp), "%6lu.%09lu ", in prepare_timestamp()
1298 (unsigned long) ts->tv_sec, ts->tv_nsec); in prepare_timestamp()
1301 static void print_header_interval_std(struct perf_stat_config *config, in print_header_interval_std() argument
1307 FILE *output = config->output; in print_header_interval_std()
1309 switch (config->aggr_mode) { in print_header_interval_std()
1316 fprintf(output, "#%*s %-*s ctrs", in print_header_interval_std()
1317 INTERVAL_LEN - 1, "time", in print_header_interval_std()
1318 aggr_header_lens[config->aggr_mode], in print_header_interval_std()
1319 aggr_header_std[config->aggr_mode]); in print_header_interval_std()
1322 fprintf(output, "#%*s %-*s", in print_header_interval_std()
1323 INTERVAL_LEN - 1, "time", in print_header_interval_std()
1324 aggr_header_lens[config->aggr_mode], in print_header_interval_std()
1325 aggr_header_std[config->aggr_mode]); in print_header_interval_std()
1328 fprintf(output, "#%*s %*s-%-*s", in print_header_interval_std()
1329 INTERVAL_LEN - 1, "time", in print_header_interval_std()
1334 if (!config->iostat_run) in print_header_interval_std()
1336 INTERVAL_LEN - 1, "time"); in print_header_interval_std()
1342 if (config->metric_only) in print_header_interval_std()
1343 print_metric_headers(config, evlist, true); in print_header_interval_std()
1346 COUNTS_LEN, "counts", config->unit_width, "unit"); in print_header_interval_std()
1349 static void print_header_std(struct perf_stat_config *config, in print_header_std() argument
1353 FILE *output = config->output; in print_header_std()
1358 if (_target->bpf_str) in print_header_std()
1359 fprintf(output, "\'BPF program(s) %s", _target->bpf_str); in print_header_std()
1360 else if (_target->system_wide) in print_header_std()
1362 else if (_target->cpu_list) in print_header_std()
1363 fprintf(output, "\'CPU(s) %s", _target->cpu_list); in print_header_std()
1368 } else if (_target->pid) in print_header_std()
1369 fprintf(output, "process id \'%s", _target->pid); in print_header_std()
1371 fprintf(output, "thread id \'%s", _target->tid); in print_header_std()
1374 if (config->run_count > 1) in print_header_std()
1375 fprintf(output, " (%d runs)", config->run_count); in print_header_std()
1378 if (config->metric_only) in print_header_std()
1379 print_metric_headers(config, evlist, false); in print_header_std()
1382 static void print_header_csv(struct perf_stat_config *config, in print_header_csv() argument
1388 if (config->metric_only) in print_header_csv()
1389 print_metric_headers(config, evlist, true); in print_header_csv()
1391 static void print_header_json(struct perf_stat_config *config, in print_header_json() argument
1397 if (config->metric_only) in print_header_json()
1398 print_metric_headers(config, evlist, true); in print_header_json()
1401 static void print_header(struct perf_stat_config *config, in print_header() argument
1406 static int num_print_iv; in print_header()
1410 if (config->interval_clear) in print_header()
1413 if (num_print_iv == 0 || config->interval_clear) { in print_header()
1414 if (config->json_output) in print_header()
1415 print_header_json(config, _target, evlist, argc, argv); in print_header()
1416 else if (config->csv_output) in print_header()
1417 print_header_csv(config, _target, evlist, argc, argv); in print_header()
1418 else if (config->interval) in print_header()
1419 print_header_interval_std(config, _target, evlist, argc, argv); in print_header()
1421 print_header_std(config, _target, evlist, argc, argv); in print_header()
1428 static int get_precision(double num) in get_precision()
1433 return lround(ceil(-log10(num))); in get_precision()
1436 static void print_table(struct perf_stat_config *config, in print_table() argument
1448 for (idx = 0; idx < config->run_count; idx++) { in print_table()
1449 double run = (double) config->walltime_run[idx] / NSEC_PER_SEC; in print_table()
1450 int h, n = 1 + abs((int) (100.0 * (run - avg)/run) / 5); in print_table()
1453 precision, run, precision, run - avg); in print_table()
1464 static double timeval2double(struct timeval *t) in timeval2double()
1466 return t->tv_sec + (double) t->tv_usec/USEC_PER_SEC; in timeval2double()
1469 static void print_footer(struct perf_stat_config *config) in print_footer() argument
1471 double avg = avg_stats(config->walltime_nsecs_stats) / NSEC_PER_SEC; in print_footer()
1472 FILE *output = config->output; in print_footer()
1474 if (config->interval || config->csv_output || config->json_output) in print_footer()
1477 if (!config->null_run) in print_footer()
1480 if (config->run_count == 1) { in print_footer()
1483 if (config->ru_display) { in print_footer()
1484 double ru_utime = timeval2double(&config->ru_data.ru_utime); in print_footer()
1485 double ru_stime = timeval2double(&config->ru_data.ru_stime); in print_footer()
1492 double sd = stddev_stats(config->walltime_nsecs_stats) / NSEC_PER_SEC; in print_footer()
1499 if (config->walltime_run_table) in print_footer()
1500 print_table(config, output, precision, avg); in print_footer()
1502 fprintf(output, " %17.*f +- %.*f seconds time elapsed", in print_footer()
1505 print_noise_pct(config, NULL, sd, avg, /*before_metric=*/false); in print_footer()
1509 if (config->print_free_counters_hint && sysctl__nmi_watchdog_enabled()) in print_footer()
1517 static void print_percore(struct perf_stat_config *config, in print_percore() argument
1520 bool metric_only = config->metric_only; in print_percore()
1521 FILE *output = config->output; in print_percore()
1525 if (!config->aggr_map || !config->aggr_get_id) in print_percore()
1528 if (config->percore_show_thread) in print_percore()
1529 return print_counter(config, counter, os); in print_percore()
1535 core_map = cpu_aggr_map__empty_new(config->aggr_map->nr); in print_percore()
1537 fprintf(output, "Cannot allocate per-core aggr map for display\n"); in print_percore()
1541 cpu_aggr_map__for_each_idx(aggr_idx, config->aggr_map) { in print_percore()
1542 struct perf_cpu curr_cpu = config->aggr_map->map[aggr_idx].cpu; in print_percore()
1547 if (aggr_cpu_id__equal(&core_map->map[i], &core_id)) { in print_percore()
1555 print_counter_aggrdata(config, counter, aggr_idx, os); in print_percore()
1557 core_map->map[core_map_len++] = core_id; in print_percore()
1565 static void print_cgroup_counter(struct perf_stat_config *config, struct evlist *evlist, in print_cgroup_counter() argument
1571 if (os->cgrp != counter->cgrp) { in print_cgroup_counter()
1572 if (os->cgrp != NULL) in print_cgroup_counter()
1573 print_metric_end(config, os); in print_cgroup_counter()
1575 os->cgrp = counter->cgrp; in print_cgroup_counter()
1576 print_metric_begin(config, evlist, os, /*aggr_idx=*/0); in print_cgroup_counter()
1579 print_counter(config, counter, os); in print_cgroup_counter()
1581 if (os->cgrp) in print_cgroup_counter()
1582 print_metric_end(config, os); in print_cgroup_counter()
1585 void evlist__print_counters(struct evlist *evlist, struct perf_stat_config *config, in evlist__print_counters() argument
1589 bool metric_only = config->metric_only; in evlist__print_counters()
1592 .fh = config->output, in evlist__print_counters()
1596 evlist__uniquify_evsel_names(evlist, config); in evlist__print_counters()
1598 if (config->iostat_run) in evlist__print_counters()
1599 evlist->selected = evlist__first(evlist); in evlist__print_counters()
1601 if (config->interval) in evlist__print_counters()
1602 prepare_timestamp(config, &os, ts); in evlist__print_counters()
1604 print_header(config, _target, evlist, argc, argv); in evlist__print_counters()
1606 switch (config->aggr_mode) { in evlist__print_counters()
1613 if (config->cgroup_list) in evlist__print_counters()
1614 print_aggr_cgroup(config, evlist, &os); in evlist__print_counters()
1616 print_aggr(config, evlist, &os); in evlist__print_counters()
1620 if (config->iostat_run) { in evlist__print_counters()
1621 iostat_print_counters(evlist, config, ts, os.timestamp, in evlist__print_counters()
1623 } else if (config->cgroup_list) { in evlist__print_counters()
1624 print_cgroup_counter(config, evlist, &os); in evlist__print_counters()
1626 print_metric_begin(config, evlist, &os, /*aggr_idx=*/0); in evlist__print_counters()
1628 print_counter(config, counter, &os); in evlist__print_counters()
1630 print_metric_end(config, &os); in evlist__print_counters()
1635 print_no_aggr_metric(config, evlist, &os); in evlist__print_counters()
1638 if (counter->percore) in evlist__print_counters()
1639 print_percore(config, counter, &os); in evlist__print_counters()
1641 print_counter(config, counter, &os); in evlist__print_counters()
1651 print_footer(config); in evlist__print_counters()
1653 fflush(config->output); in evlist__print_counters()