diff options
Diffstat (limited to 'tools/perf/builtin-stat.c')
| -rw-r--r-- | tools/perf/builtin-stat.c | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 8906adfdbd8..e0f95755361 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
| @@ -76,7 +76,6 @@ static struct perf_event_attr default_attrs[] = { | |||
| 76 | struct perf_evlist *evsel_list; | 76 | struct perf_evlist *evsel_list; |
| 77 | 77 | ||
| 78 | static bool system_wide = false; | 78 | static bool system_wide = false; |
| 79 | static struct cpu_map *cpus; | ||
| 80 | static int run_idx = 0; | 79 | static int run_idx = 0; |
| 81 | 80 | ||
| 82 | static int run_count = 1; | 81 | static int run_count = 1; |
| @@ -85,7 +84,6 @@ static bool scale = true; | |||
| 85 | static bool no_aggr = false; | 84 | static bool no_aggr = false; |
| 86 | static pid_t target_pid = -1; | 85 | static pid_t target_pid = -1; |
| 87 | static pid_t target_tid = -1; | 86 | static pid_t target_tid = -1; |
| 88 | static struct thread_map *threads; | ||
| 89 | static pid_t child_pid = -1; | 87 | static pid_t child_pid = -1; |
| 90 | static bool null_run = false; | 88 | static bool null_run = false; |
| 91 | static bool big_num = true; | 89 | static bool big_num = true; |
| @@ -170,7 +168,7 @@ static int create_perf_stat_counter(struct perf_evsel *evsel) | |||
| 170 | PERF_FORMAT_TOTAL_TIME_RUNNING; | 168 | PERF_FORMAT_TOTAL_TIME_RUNNING; |
| 171 | 169 | ||
| 172 | if (system_wide) | 170 | if (system_wide) |
| 173 | return perf_evsel__open_per_cpu(evsel, cpus, false, false); | 171 | return perf_evsel__open_per_cpu(evsel, evsel_list->cpus, false, false); |
| 174 | 172 | ||
| 175 | attr->inherit = !no_inherit; | 173 | attr->inherit = !no_inherit; |
| 176 | if (target_pid == -1 && target_tid == -1) { | 174 | if (target_pid == -1 && target_tid == -1) { |
| @@ -178,7 +176,7 @@ static int create_perf_stat_counter(struct perf_evsel *evsel) | |||
| 178 | attr->enable_on_exec = 1; | 176 | attr->enable_on_exec = 1; |
| 179 | } | 177 | } |
| 180 | 178 | ||
| 181 | return perf_evsel__open_per_thread(evsel, threads, false, false); | 179 | return perf_evsel__open_per_thread(evsel, evsel_list->threads, false, false); |
| 182 | } | 180 | } |
| 183 | 181 | ||
| 184 | /* | 182 | /* |
| @@ -203,7 +201,8 @@ static int read_counter_aggr(struct perf_evsel *counter) | |||
| 203 | u64 *count = counter->counts->aggr.values; | 201 | u64 *count = counter->counts->aggr.values; |
| 204 | int i; | 202 | int i; |
| 205 | 203 | ||
| 206 | if (__perf_evsel__read(counter, cpus->nr, threads->nr, scale) < 0) | 204 | if (__perf_evsel__read(counter, evsel_list->cpus->nr, |
| 205 | evsel_list->threads->nr, scale) < 0) | ||
| 207 | return -1; | 206 | return -1; |
| 208 | 207 | ||
| 209 | for (i = 0; i < 3; i++) | 208 | for (i = 0; i < 3; i++) |
| @@ -236,7 +235,7 @@ static int read_counter(struct perf_evsel *counter) | |||
| 236 | u64 *count; | 235 | u64 *count; |
| 237 | int cpu; | 236 | int cpu; |
| 238 | 237 | ||
| 239 | for (cpu = 0; cpu < cpus->nr; cpu++) { | 238 | for (cpu = 0; cpu < evsel_list->cpus->nr; cpu++) { |
| 240 | if (__perf_evsel__read_on_cpu(counter, cpu, 0, scale) < 0) | 239 | if (__perf_evsel__read_on_cpu(counter, cpu, 0, scale) < 0) |
| 241 | return -1; | 240 | return -1; |
| 242 | 241 | ||
| @@ -301,7 +300,7 @@ static int run_perf_stat(int argc __used, const char **argv) | |||
| 301 | } | 300 | } |
| 302 | 301 | ||
| 303 | if (target_tid == -1 && target_pid == -1 && !system_wide) | 302 | if (target_tid == -1 && target_pid == -1 && !system_wide) |
| 304 | threads->map[0] = child_pid; | 303 | evsel_list->threads->map[0] = child_pid; |
| 305 | 304 | ||
| 306 | /* | 305 | /* |
| 307 | * Wait for the child to be ready to exec. | 306 | * Wait for the child to be ready to exec. |
| @@ -353,12 +352,13 @@ static int run_perf_stat(int argc __used, const char **argv) | |||
| 353 | if (no_aggr) { | 352 | if (no_aggr) { |
| 354 | list_for_each_entry(counter, &evsel_list->entries, node) { | 353 | list_for_each_entry(counter, &evsel_list->entries, node) { |
| 355 | read_counter(counter); | 354 | read_counter(counter); |
| 356 | perf_evsel__close_fd(counter, cpus->nr, 1); | 355 | perf_evsel__close_fd(counter, evsel_list->cpus->nr, 1); |
| 357 | } | 356 | } |
| 358 | } else { | 357 | } else { |
| 359 | list_for_each_entry(counter, &evsel_list->entries, node) { | 358 | list_for_each_entry(counter, &evsel_list->entries, node) { |
| 360 | read_counter_aggr(counter); | 359 | read_counter_aggr(counter); |
| 361 | perf_evsel__close_fd(counter, cpus->nr, threads->nr); | 360 | perf_evsel__close_fd(counter, evsel_list->cpus->nr, |
| 361 | evsel_list->threads->nr); | ||
| 362 | } | 362 | } |
| 363 | } | 363 | } |
| 364 | 364 | ||
| @@ -386,7 +386,7 @@ static void nsec_printout(int cpu, struct perf_evsel *evsel, double avg) | |||
| 386 | if (no_aggr) | 386 | if (no_aggr) |
| 387 | sprintf(cpustr, "CPU%*d%s", | 387 | sprintf(cpustr, "CPU%*d%s", |
| 388 | csv_output ? 0 : -4, | 388 | csv_output ? 0 : -4, |
| 389 | cpus->map[cpu], csv_sep); | 389 | evsel_list->cpus->map[cpu], csv_sep); |
| 390 | 390 | ||
| 391 | fprintf(stderr, fmt, cpustr, msecs, csv_sep, event_name(evsel)); | 391 | fprintf(stderr, fmt, cpustr, msecs, csv_sep, event_name(evsel)); |
| 392 | 392 | ||
| @@ -414,7 +414,7 @@ static void abs_printout(int cpu, struct perf_evsel *evsel, double avg) | |||
| 414 | if (no_aggr) | 414 | if (no_aggr) |
| 415 | sprintf(cpustr, "CPU%*d%s", | 415 | sprintf(cpustr, "CPU%*d%s", |
| 416 | csv_output ? 0 : -4, | 416 | csv_output ? 0 : -4, |
| 417 | cpus->map[cpu], csv_sep); | 417 | evsel_list->cpus->map[cpu], csv_sep); |
| 418 | else | 418 | else |
| 419 | cpu = 0; | 419 | cpu = 0; |
| 420 | 420 | ||
| @@ -500,14 +500,14 @@ static void print_counter(struct perf_evsel *counter) | |||
| 500 | u64 ena, run, val; | 500 | u64 ena, run, val; |
| 501 | int cpu; | 501 | int cpu; |
| 502 | 502 | ||
| 503 | for (cpu = 0; cpu < cpus->nr; cpu++) { | 503 | for (cpu = 0; cpu < evsel_list->cpus->nr; cpu++) { |
| 504 | val = counter->counts->cpu[cpu].val; | 504 | val = counter->counts->cpu[cpu].val; |
| 505 | ena = counter->counts->cpu[cpu].ena; | 505 | ena = counter->counts->cpu[cpu].ena; |
| 506 | run = counter->counts->cpu[cpu].run; | 506 | run = counter->counts->cpu[cpu].run; |
| 507 | if (run == 0 || ena == 0) { | 507 | if (run == 0 || ena == 0) { |
| 508 | fprintf(stderr, "CPU%*d%s%*s%s%-24s", | 508 | fprintf(stderr, "CPU%*d%s%*s%s%-24s", |
| 509 | csv_output ? 0 : -4, | 509 | csv_output ? 0 : -4, |
| 510 | cpus->map[cpu], csv_sep, | 510 | evsel_list->cpus->map[cpu], csv_sep, |
| 511 | csv_output ? 0 : 18, | 511 | csv_output ? 0 : 18, |
| 512 | "<not counted>", csv_sep, | 512 | "<not counted>", csv_sep, |
| 513 | event_name(counter)); | 513 | event_name(counter)); |
| @@ -652,7 +652,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) | |||
| 652 | 652 | ||
| 653 | setlocale(LC_ALL, ""); | 653 | setlocale(LC_ALL, ""); |
| 654 | 654 | ||
| 655 | evsel_list = perf_evlist__new(); | 655 | evsel_list = perf_evlist__new(NULL, NULL); |
| 656 | if (evsel_list == NULL) | 656 | if (evsel_list == NULL) |
| 657 | return -ENOMEM; | 657 | return -ENOMEM; |
| 658 | 658 | ||
| @@ -701,18 +701,18 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) | |||
| 701 | if (target_pid != -1) | 701 | if (target_pid != -1) |
| 702 | target_tid = target_pid; | 702 | target_tid = target_pid; |
| 703 | 703 | ||
| 704 | threads = thread_map__new(target_pid, target_tid); | 704 | evsel_list->threads = thread_map__new(target_pid, target_tid); |
| 705 | if (threads == NULL) { | 705 | if (evsel_list->threads == NULL) { |
| 706 | pr_err("Problems finding threads of monitor\n"); | 706 | pr_err("Problems finding threads of monitor\n"); |
| 707 | usage_with_options(stat_usage, options); | 707 | usage_with_options(stat_usage, options); |
| 708 | } | 708 | } |
| 709 | 709 | ||
| 710 | if (system_wide) | 710 | if (system_wide) |
| 711 | cpus = cpu_map__new(cpu_list); | 711 | evsel_list->cpus = cpu_map__new(cpu_list); |
| 712 | else | 712 | else |
| 713 | cpus = cpu_map__dummy_new(); | 713 | evsel_list->cpus = cpu_map__dummy_new(); |
| 714 | 714 | ||
| 715 | if (cpus == NULL) { | 715 | if (evsel_list->cpus == NULL) { |
| 716 | perror("failed to parse CPUs map"); | 716 | perror("failed to parse CPUs map"); |
| 717 | usage_with_options(stat_usage, options); | 717 | usage_with_options(stat_usage, options); |
| 718 | return -1; | 718 | return -1; |
| @@ -720,8 +720,8 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) | |||
| 720 | 720 | ||
| 721 | list_for_each_entry(pos, &evsel_list->entries, node) { | 721 | list_for_each_entry(pos, &evsel_list->entries, node) { |
| 722 | if (perf_evsel__alloc_stat_priv(pos) < 0 || | 722 | if (perf_evsel__alloc_stat_priv(pos) < 0 || |
| 723 | perf_evsel__alloc_counts(pos, cpus->nr) < 0 || | 723 | perf_evsel__alloc_counts(pos, evsel_list->cpus->nr) < 0 || |
| 724 | perf_evsel__alloc_fd(pos, cpus->nr, threads->nr) < 0) | 724 | perf_evsel__alloc_fd(pos, evsel_list->cpus->nr, evsel_list->threads->nr) < 0) |
| 725 | goto out_free_fd; | 725 | goto out_free_fd; |
| 726 | } | 726 | } |
| 727 | 727 | ||
| @@ -750,7 +750,6 @@ out_free_fd: | |||
| 750 | perf_evsel__free_stat_priv(pos); | 750 | perf_evsel__free_stat_priv(pos); |
| 751 | perf_evlist__delete(evsel_list); | 751 | perf_evlist__delete(evsel_list); |
| 752 | out: | 752 | out: |
| 753 | thread_map__delete(threads); | 753 | perf_evlist__delete_maps(evsel_list); |
| 754 | threads = NULL; | ||
| 755 | return status; | 754 | return status; |
| 756 | } | 755 | } |
