diff options
Diffstat (limited to 'tools/perf/builtin-stat.c')
| -rw-r--r-- | tools/perf/builtin-stat.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index a9f06715e44d..1ad04ce29c34 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
| @@ -61,6 +61,8 @@ | |||
| 61 | #include <locale.h> | 61 | #include <locale.h> |
| 62 | 62 | ||
| 63 | #define DEFAULT_SEPARATOR " " | 63 | #define DEFAULT_SEPARATOR " " |
| 64 | #define CNTR_NOT_SUPPORTED "<not supported>" | ||
| 65 | #define CNTR_NOT_COUNTED "<not counted>" | ||
| 64 | 66 | ||
| 65 | static struct perf_event_attr default_attrs[] = { | 67 | static struct perf_event_attr default_attrs[] = { |
| 66 | 68 | ||
| @@ -448,6 +450,7 @@ static int run_perf_stat(int argc __used, const char **argv) | |||
| 448 | if (verbose) | 450 | if (verbose) |
| 449 | ui__warning("%s event is not supported by the kernel.\n", | 451 | ui__warning("%s event is not supported by the kernel.\n", |
| 450 | event_name(counter)); | 452 | event_name(counter)); |
| 453 | counter->supported = false; | ||
| 451 | continue; | 454 | continue; |
| 452 | } | 455 | } |
| 453 | 456 | ||
| @@ -466,6 +469,7 @@ static int run_perf_stat(int argc __used, const char **argv) | |||
| 466 | die("Not all events could be opened.\n"); | 469 | die("Not all events could be opened.\n"); |
| 467 | return -1; | 470 | return -1; |
| 468 | } | 471 | } |
| 472 | counter->supported = true; | ||
| 469 | } | 473 | } |
| 470 | 474 | ||
| 471 | if (perf_evlist__set_filters(evsel_list)) { | 475 | if (perf_evlist__set_filters(evsel_list)) { |
| @@ -513,7 +517,10 @@ static void print_noise_pct(double total, double avg) | |||
| 513 | if (avg) | 517 | if (avg) |
| 514 | pct = 100.0*total/avg; | 518 | pct = 100.0*total/avg; |
| 515 | 519 | ||
| 516 | fprintf(stderr, " ( +-%6.2f%% )", pct); | 520 | if (csv_output) |
| 521 | fprintf(stderr, "%s%.2f%%", csv_sep, pct); | ||
| 522 | else | ||
| 523 | fprintf(stderr, " ( +-%6.2f%% )", pct); | ||
| 517 | } | 524 | } |
| 518 | 525 | ||
| 519 | static void print_noise(struct perf_evsel *evsel, double avg) | 526 | static void print_noise(struct perf_evsel *evsel, double avg) |
| @@ -861,7 +868,7 @@ static void print_counter_aggr(struct perf_evsel *counter) | |||
| 861 | if (scaled == -1) { | 868 | if (scaled == -1) { |
| 862 | fprintf(stderr, "%*s%s%*s", | 869 | fprintf(stderr, "%*s%s%*s", |
| 863 | csv_output ? 0 : 18, | 870 | csv_output ? 0 : 18, |
| 864 | "<not counted>", | 871 | counter->supported ? CNTR_NOT_COUNTED : CNTR_NOT_SUPPORTED, |
| 865 | csv_sep, | 872 | csv_sep, |
| 866 | csv_output ? 0 : -24, | 873 | csv_output ? 0 : -24, |
| 867 | event_name(counter)); | 874 | event_name(counter)); |
| @@ -878,13 +885,13 @@ static void print_counter_aggr(struct perf_evsel *counter) | |||
| 878 | else | 885 | else |
| 879 | abs_printout(-1, counter, avg); | 886 | abs_printout(-1, counter, avg); |
| 880 | 887 | ||
| 888 | print_noise(counter, avg); | ||
| 889 | |||
| 881 | if (csv_output) { | 890 | if (csv_output) { |
| 882 | fputc('\n', stderr); | 891 | fputc('\n', stderr); |
| 883 | return; | 892 | return; |
| 884 | } | 893 | } |
| 885 | 894 | ||
| 886 | print_noise(counter, avg); | ||
| 887 | |||
| 888 | if (scaled) { | 895 | if (scaled) { |
| 889 | double avg_enabled, avg_running; | 896 | double avg_enabled, avg_running; |
| 890 | 897 | ||
| @@ -914,7 +921,8 @@ static void print_counter(struct perf_evsel *counter) | |||
| 914 | csv_output ? 0 : -4, | 921 | csv_output ? 0 : -4, |
| 915 | evsel_list->cpus->map[cpu], csv_sep, | 922 | evsel_list->cpus->map[cpu], csv_sep, |
| 916 | csv_output ? 0 : 18, | 923 | csv_output ? 0 : 18, |
| 917 | "<not counted>", csv_sep, | 924 | counter->supported ? CNTR_NOT_COUNTED : CNTR_NOT_SUPPORTED, |
| 925 | csv_sep, | ||
| 918 | csv_output ? 0 : -24, | 926 | csv_output ? 0 : -24, |
| 919 | event_name(counter)); | 927 | event_name(counter)); |
| 920 | 928 | ||
| @@ -1024,7 +1032,7 @@ static int stat__set_big_num(const struct option *opt __used, | |||
| 1024 | static const struct option options[] = { | 1032 | static const struct option options[] = { |
| 1025 | OPT_CALLBACK('e', "event", &evsel_list, "event", | 1033 | OPT_CALLBACK('e', "event", &evsel_list, "event", |
| 1026 | "event selector. use 'perf list' to list available events", | 1034 | "event selector. use 'perf list' to list available events", |
| 1027 | parse_events), | 1035 | parse_events_option), |
| 1028 | OPT_CALLBACK(0, "filter", &evsel_list, "filter", | 1036 | OPT_CALLBACK(0, "filter", &evsel_list, "filter", |
| 1029 | "event filter", parse_filter), | 1037 | "event filter", parse_filter), |
| 1030 | OPT_BOOLEAN('i', "no-inherit", &no_inherit, | 1038 | OPT_BOOLEAN('i', "no-inherit", &no_inherit, |
