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 8906adfdbd8e..e0f95755361b 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 | } |