Lines Matching refs:config
102 static void print_running_std(struct perf_stat_config *config, u64 run, u64 ena)
105 fprintf(config->output, " (%.2f%%)", 100.0 * run / ena);
108 static void print_running_csv(struct perf_stat_config *config, u64 run, u64 ena)
114 fprintf(config->output, "%s%" PRIu64 "%s%.2f",
115 config->csv_sep, run, config->csv_sep, enabled_percent);
164 static void print_running(struct perf_stat_config *config, struct outstate *os,
167 if (config->json_output) {
170 } else if (config->csv_output) {
172 print_running_csv(config, run, ena);
175 print_running_std(config, run, ena);
179 static void print_noise_pct_std(struct perf_stat_config *config,
183 fprintf(config->output, " ( +-%6.2f%% )", pct);
186 static void print_noise_pct_csv(struct perf_stat_config *config,
189 fprintf(config->output, "%s%.2f%%", config->csv_sep, pct);
198 static void print_noise_pct(struct perf_stat_config *config, struct outstate *os,
203 if (config->json_output) {
206 } else if (config->csv_output) {
208 print_noise_pct_csv(config, pct);
211 print_noise_pct_std(config, pct);
215 static void print_noise(struct perf_stat_config *config, struct outstate *os,
220 if (config->run_count == 1)
224 print_noise_pct(config, os, stddev_stats(&ps->res_stats), avg, before_metric);
227 static void print_cgroup_std(struct perf_stat_config *config, const char *cgrp_name)
229 fprintf(config->output, " %-*s", CGROUP_LEN, cgrp_name);
232 static void print_cgroup_csv(struct perf_stat_config *config, const char *cgrp_name)
234 fprintf(config->output, "%s%s", config->csv_sep, cgrp_name);
242 static void print_cgroup(struct perf_stat_config *config, struct outstate *os,
245 if (nr_cgroups || config->cgroup_list) {
248 if (config->json_output)
250 else if (config->csv_output)
251 print_cgroup_csv(config, cgrp_name);
253 print_cgroup_std(config, cgrp_name);
257 static void print_aggr_id_std(struct perf_stat_config *config,
260 FILE *output = config->output;
261 int idx = config->aggr_mode;
264 switch (config->aggr_mode) {
285 if (evsel->percore && !config->percore_show_thread) {
310 static void print_aggr_id_csv(struct perf_stat_config *config,
313 FILE *output = config->output;
314 const char *sep = config->csv_sep;
316 switch (config->aggr_mode) {
322 fprintf(config->output, "S%d-D%d-L%d-ID%d%s%d%s",
326 fprintf(config->output, "S%d-D%d-CLS%d%s%d%s",
342 if (evsel->percore && !config->percore_show_thread) {
364 static void print_aggr_id_json(struct perf_stat_config *config, struct outstate *os,
367 switch (config->aggr_mode) {
393 if (evsel->percore && !config->percore_show_thread) {
414 static void aggr_printout(struct perf_stat_config *config, struct outstate *os,
417 if (config->json_output)
418 print_aggr_id_json(config, os, evsel, id, aggr_nr);
419 else if (config->csv_output)
420 print_aggr_id_csv(config, evsel, id, aggr_nr);
422 print_aggr_id_std(config, evsel, id, aggr_nr);
425 static void new_line_std(struct perf_stat_config *config __maybe_unused,
433 static inline void __new_line_std_csv(struct perf_stat_config *config,
437 if (config->interval)
439 aggr_printout(config, os, os->evsel, os->id, os->aggr_nr);
447 static void do_new_line_std(struct perf_stat_config *config,
450 __new_line_std_csv(config, os);
451 if (config->aggr_mode == AGGR_NONE)
456 static void print_metric_std(struct perf_stat_config *config,
474 do_new_line_std(config, os);
484 static void new_line_csv(struct perf_stat_config *config, void *ctx)
489 __new_line_std_csv(config, os);
491 fputs(config->csv_sep, os->fh);
494 static void print_metric_csv(struct perf_stat_config *config __maybe_unused,
504 fprintf(out, "%s%s", config->csv_sep, config->csv_sep);
512 fprintf(out, "%s%s%s%s", config->csv_sep, vals, config->csv_sep, skip_spaces(unit));
515 static void print_metric_json(struct perf_stat_config *config __maybe_unused,
531 if (!config->metric_only)
535 static void new_line_json(struct perf_stat_config *config, void *ctx)
541 if (config->interval)
544 aggr_printout(config, os, os->evsel, os->id, os->aggr_nr);
547 static void print_metricgroup_header_json(struct perf_stat_config *config,
555 new_line_json(config, ctx);
558 static void print_metricgroup_header_csv(struct perf_stat_config *config,
568 fputs(config->csv_sep, os->fh);
573 fputs(config->csv_sep, os->fh);
574 fprintf(config->output, "%s", metricgroup_name);
575 new_line_csv(config, ctx);
578 static void print_metricgroup_header_std(struct perf_stat_config *config,
590 n = fprintf(config->output, " %*s", EVNAME_LEN, metricgroup_name);
592 fprintf(config->output, "%*s", MGROUP_LEN - n - 1, "");
618 static void print_metric_only(struct perf_stat_config *config,
625 unsigned mlen = config->metric_only_len;
642 static void print_metric_only_csv(struct perf_stat_config *config __maybe_unused,
661 fprintf(out, "%s%s", vals, config->csv_sep);
665 static void print_metric_only_json(struct perf_stat_config *config __maybe_unused,
691 static void print_metric_header(struct perf_stat_config *config,
701 if (config->iostat_run &&
712 if (config->json_output)
714 else if (config->csv_output)
715 fprintf(os->fh, "%s%s", unit, config->csv_sep);
717 fprintf(os->fh, "%*s ", config->metric_only_len, unit);
720 static void print_counter_value_std(struct perf_stat_config *config,
723 FILE *output = config->output;
728 if (config->big_num)
739 fprintf(output, "%-*s ", config->unit_width, evsel->unit);
744 static void print_counter_value_csv(struct perf_stat_config *config,
747 FILE *output = config->output;
749 const char *sep = config->csv_sep;
780 static void print_counter_value(struct perf_stat_config *config, struct outstate *os,
783 if (config->json_output)
785 else if (config->csv_output)
786 print_counter_value_csv(config, evsel, avg, ok);
788 print_counter_value_std(config, evsel, avg, ok);
791 static void abs_printout(struct perf_stat_config *config,
796 aggr_printout(config, os, evsel, id, aggr_nr);
797 print_counter_value(config, os, evsel, avg, ok);
798 print_cgroup(config, os, evsel->cgrp);
840 static void printout(struct perf_stat_config *config, struct outstate *os,
850 if (config->csv_output) {
851 pm = config->metric_only ? print_metric_only_csv : print_metric_csv;
852 nl = config->metric_only ? NULL : new_line_csv;
855 } else if (config->json_output) {
856 pm = config->metric_only ? print_metric_only_json : print_metric_json;
857 nl = config->metric_only ? NULL : new_line_json;
860 pm = config->metric_only ? print_metric_only : print_metric_std;
861 nl = config->metric_only ? NULL : new_line_std;
866 if (config->metric_only) {
867 pm(config, os, METRIC_THRESHOLD_UNKNOWN, /*format=*/NULL,
876 config->print_free_counters_hint = 1;
878 config->print_mixed_hw_group_error = 1;
889 if (!config->metric_only && !counter->default_metricgroup) {
890 abs_printout(config, os, os->id, os->aggr_nr, counter, uval, ok);
892 print_noise(config, os, counter, noise, /*before_metric=*/true);
893 print_running(config, os, run, ena, /*before_metric=*/true);
897 if (!config->metric_only && counter->default_metricgroup) {
900 aggr_printout(config, os, os->evsel, os->id, os->aggr_nr);
907 if (config->json_output)
908 new_line_json(config, (void *)os);
910 __new_line_std_csv(config, os);
913 print_noise(config, os, counter, noise, /*before_metric=*/true);
914 print_running(config, os, run, ena, /*before_metric=*/true);
915 from = perf_stat__print_shadow_stats_metricgroup(config, counter, aggr_idx,
917 &config->metric_events);
920 perf_stat__print_shadow_stats(config, counter, uval, aggr_idx,
921 &out, &config->metric_events);
923 pm(config, os, METRIC_THRESHOLD_UNKNOWN, /*format=*/NULL, /*unit=*/NULL, /*val=*/0);
926 if (!config->metric_only) {
927 print_noise(config, os, counter, noise, /*before_metric=*/false);
928 print_running(config, os, run, ena, /*before_metric=*/false);
935 char *new_name, *config;
945 /* The evsel has a "name=" config term or is from libpfm. */
964 config = strchr(name, '/');
965 if (config) {
966 int len = config - name;
968 if (config[1] == '/') {
970 ret = asprintf(&new_name, "%s/%.*s/%s", pmu_name, len, name, config + 2);
973 ret = asprintf(&new_name, "%s/%.*s,%s", pmu_name, len, name, config + 1);
976 config = strchr(name, ':');
977 if (config) {
979 int len = config - name;
981 ret = asprintf(&new_name, "%s/%.*s/%s", pmu_name, len, name, config + 1);
996 static bool hybrid_uniquify(struct evsel *evsel, struct perf_stat_config *config)
998 return evsel__is_hybrid(evsel) && !config->hybrid_merge;
1001 static void uniquify_counter(struct perf_stat_config *config, struct evsel *counter)
1003 if (config->aggr_mode == AGGR_NONE || hybrid_uniquify(counter, config))
1009 * @config: The perf stat configuration (including aggregation mode).
1023 static bool should_skip_zero_counter(struct perf_stat_config *config,
1041 if (config->aggr_mode == AGGR_THREAD && config->system_wide)
1050 config->aggr_get_id(config, (struct perf_cpu){ .cpu = 0 });
1063 struct aggr_cpu_id own_id = config->aggr_get_id(config, cpu);
1071 static void print_counter_aggrdata(struct perf_stat_config *config,
1075 FILE *output = config->output;
1080 struct aggr_cpu_id id = config->aggr_map->map[aggr_idx];
1082 bool metric_only = config->metric_only;
1092 uniquify_counter(config, counter);
1098 if (perf_stat__skip_metric_event(counter, &config->metric_events, ena, run))
1101 if (val == 0 && should_skip_zero_counter(config, counter, &id))
1105 if (config->json_output) {
1109 if (config->interval) {
1110 if (config->json_output)
1114 } else if (config->summary && config->csv_output &&
1115 !config->no_csv_summary)
1116 fprintf(output, "%s%s", "summary", config->csv_sep);
1121 printout(config, os, uval, run, ena, avg, aggr_idx);
1127 static void print_metric_begin(struct perf_stat_config *config,
1136 if (!config->metric_only)
1139 if (config->json_output)
1140 fputc('{', config->output);
1142 if (config->interval) {
1143 if (config->json_output)
1146 fprintf(config->output, "%s", os->timestamp);
1149 id = config->aggr_map->map[aggr_idx];
1151 aggr_printout(config, os, evsel, id, aggr->nr);
1153 print_cgroup(config, os, os->cgrp ? : evsel->cgrp);
1156 static void print_metric_end(struct perf_stat_config *config, struct outstate *os)
1158 FILE *output = config->output;
1160 if (!config->metric_only)
1163 if (config->json_output) {
1171 static void print_aggr(struct perf_stat_config *config,
1178 if (!config->aggr_map || !config->aggr_get_id)
1185 cpu_aggr_map__for_each_idx(aggr_idx, config->aggr_map) {
1186 print_metric_begin(config, evlist, os, aggr_idx);
1189 print_counter_aggrdata(config, counter, aggr_idx, os);
1191 print_metric_end(config, os);
1195 static void print_aggr_cgroup(struct perf_stat_config *config,
1202 if (!config->aggr_map || !config->aggr_get_id)
1211 cpu_aggr_map__for_each_idx(aggr_idx, config->aggr_map) {
1212 print_metric_begin(config, evlist, os, aggr_idx);
1218 print_counter_aggrdata(config, counter, aggr_idx, os);
1220 print_metric_end(config, os);
1225 static void print_counter(struct perf_stat_config *config,
1230 /* AGGR_THREAD doesn't have config->aggr_get_id */
1231 if (!config->aggr_map)
1234 cpu_aggr_map__for_each_idx(aggr_idx, config->aggr_map) {
1235 print_counter_aggrdata(config, counter, aggr_idx, os);
1239 static void print_no_aggr_metric(struct perf_stat_config *config,
1259 cpu_aggr_map__for_each_idx(aggr_idx, config->aggr_map) {
1260 if (config->aggr_map->map[aggr_idx].cpu.cpu == cpu.cpu)
1267 print_metric_begin(config, evlist, os, aggr_idx);
1275 printout(config, os, uval, run, ena, 1.0, aggr_idx);
1278 print_metric_end(config, os);
1282 static void print_metric_headers_std(struct perf_stat_config *config,
1285 fputc(' ', config->output);
1288 int len = aggr_header_lens[config->aggr_mode];
1290 if (nr_cgroups || config->cgroup_list)
1293 fprintf(config->output, "%*s", len, "");
1297 static void print_metric_headers_csv(struct perf_stat_config *config,
1302 if (config->interval)
1303 fprintf(config->output, "time%s", config->csv_sep);
1304 if (config->iostat_run)
1307 p = aggr_header_csv[config->aggr_mode];
1310 fputs(config->csv_sep, config->output);
1312 fputc(*p, config->output);
1317 static void print_metric_headers_json(struct perf_stat_config *config __maybe_unused,
1322 static void print_metric_headers(struct perf_stat_config *config,
1327 .fh = config->output
1336 if (config->json_output)
1337 print_metric_headers_json(config, no_indent);
1338 else if (config->csv_output)
1339 print_metric_headers_csv(config, no_indent);
1341 print_metric_headers_std(config, no_indent);
1343 if (config->iostat_run)
1344 iostat_print_header_prefix(config);
1346 if (config->cgroup_list)
1351 if (!config->iostat_run &&
1352 config->aggr_mode != AGGR_NONE && counter->metric_leader != counter)
1357 perf_stat__print_shadow_stats(config, counter, 0,
1360 &config->metric_events);
1363 if (!config->json_output)
1364 fputc('\n', config->output);
1367 static void prepare_timestamp(struct perf_stat_config *config,
1370 if (config->iostat_run)
1373 if (config->json_output)
1376 else if (config->csv_output)
1378 (unsigned long) ts->tv_sec, ts->tv_nsec, config->csv_sep);
1384 static void print_header_interval_std(struct perf_stat_config *config,
1390 FILE *output = config->output;
1392 switch (config->aggr_mode) {
1401 aggr_header_lens[config->aggr_mode],
1402 aggr_header_std[config->aggr_mode]);
1407 aggr_header_lens[config->aggr_mode],
1408 aggr_header_std[config->aggr_mode]);
1417 if (!config->iostat_run)
1425 if (config->metric_only)
1426 print_metric_headers(config, evlist, true);
1429 COUNTS_LEN, "counts", config->unit_width, "unit");
1432 static void print_header_std(struct perf_stat_config *config,
1436 FILE *output = config->output;
1457 if (config->run_count > 1)
1458 fprintf(output, " (%d runs)", config->run_count);
1461 if (config->metric_only)
1462 print_metric_headers(config, evlist, false);
1465 static void print_header_csv(struct perf_stat_config *config,
1471 if (config->metric_only)
1472 print_metric_headers(config, evlist, true);
1474 static void print_header_json(struct perf_stat_config *config,
1480 if (config->metric_only)
1481 print_metric_headers(config, evlist, true);
1484 static void print_header(struct perf_stat_config *config,
1493 if (config->interval_clear)
1496 if (num_print_iv == 0 || config->interval_clear) {
1497 if (config->json_output)
1498 print_header_json(config, _target, evlist, argc, argv);
1499 else if (config->csv_output)
1500 print_header_csv(config, _target, evlist, argc, argv);
1501 else if (config->interval)
1502 print_header_interval_std(config, _target, evlist, argc, argv);
1504 print_header_std(config, _target, evlist, argc, argv);
1519 static void print_table(struct perf_stat_config *config,
1531 for (idx = 0; idx < config->run_count; idx++) {
1532 double run = (double) config->walltime_run[idx] / NSEC_PER_SEC;
1552 static void print_footer(struct perf_stat_config *config)
1554 double avg = avg_stats(config->walltime_nsecs_stats) / NSEC_PER_SEC;
1555 FILE *output = config->output;
1557 if (config->interval || config->csv_output || config->json_output)
1560 if (!config->null_run)
1563 if (config->run_count == 1) {
1566 if (config->ru_display) {
1567 double ru_utime = timeval2double(&config->ru_data.ru_utime);
1568 double ru_stime = timeval2double(&config->ru_data.ru_stime);
1575 double sd = stddev_stats(config->walltime_nsecs_stats) / NSEC_PER_SEC;
1582 if (config->walltime_run_table)
1583 print_table(config, output, precision, avg);
1588 print_noise_pct(config, NULL, sd, avg, /*before_metric=*/false);
1592 if (config->print_free_counters_hint && sysctl__nmi_watchdog_enabled())
1599 if (config->print_mixed_hw_group_error)
1605 static void print_percore(struct perf_stat_config *config,
1608 bool metric_only = config->metric_only;
1609 FILE *output = config->output;
1613 if (!config->aggr_map || !config->aggr_get_id)
1616 if (config->percore_show_thread)
1617 return print_counter(config, counter, os);
1623 core_map = cpu_aggr_map__empty_new(config->aggr_map->nr);
1629 cpu_aggr_map__for_each_idx(aggr_idx, config->aggr_map) {
1630 struct perf_cpu curr_cpu = config->aggr_map->map[aggr_idx].cpu;
1643 print_counter_aggrdata(config, counter, aggr_idx, os);
1653 static void print_cgroup_counter(struct perf_stat_config *config, struct evlist *evlist,
1661 print_metric_end(config, os);
1664 print_metric_begin(config, evlist, os, /*aggr_idx=*/0);
1667 print_counter(config, counter, os);
1670 print_metric_end(config, os);
1698 void evlist__print_counters(struct evlist *evlist, struct perf_stat_config *config,
1702 bool metric_only = config->metric_only;
1705 .fh = config->output,
1711 if (config->iostat_run)
1714 if (config->interval)
1715 prepare_timestamp(config, &os, ts);
1717 print_header(config, _target, evlist, argc, argv);
1719 switch (config->aggr_mode) {
1726 if (config->cgroup_list)
1727 print_aggr_cgroup(config, evlist, &os);
1729 print_aggr(config, evlist, &os);
1733 if (config->iostat_run) {
1734 iostat_print_counters(evlist, config, ts, os.timestamp,
1736 } else if (config->cgroup_list) {
1737 print_cgroup_counter(config, evlist, &os);
1739 print_metric_begin(config, evlist, &os, /*aggr_idx=*/0);
1741 print_counter(config, counter, &os);
1743 print_metric_end(config, &os);
1748 print_no_aggr_metric(config, evlist, &os);
1752 print_percore(config, counter, &os);
1754 print_counter(config, counter, &os);
1764 print_footer(config);
1766 fflush(config->output);