diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/perf/builtin-record.c | 44 | ||||
| -rw-r--r-- | tools/perf/builtin-stat.c | 45 | ||||
| -rw-r--r-- | tools/perf/builtin-test.c | 6 | ||||
| -rw-r--r-- | tools/perf/builtin-top.c | 47 | ||||
| -rwxr-xr-x | tools/perf/python/twatch.py | 4 | ||||
| -rw-r--r-- | tools/perf/util/evlist.c | 67 | ||||
| -rw-r--r-- | tools/perf/util/evlist.h | 29 | ||||
| -rw-r--r-- | tools/perf/util/python.c | 25 |
8 files changed, 148 insertions, 119 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index edc3555098c..07f8d6d852c 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
| @@ -42,7 +42,6 @@ static u64 user_interval = ULLONG_MAX; | |||
| 42 | static u64 default_interval = 0; | 42 | static u64 default_interval = 0; |
| 43 | static u64 sample_type; | 43 | static u64 sample_type; |
| 44 | 44 | ||
| 45 | static struct cpu_map *cpus; | ||
| 46 | static unsigned int page_size; | 45 | static unsigned int page_size; |
| 47 | static unsigned int mmap_pages = 128; | 46 | static unsigned int mmap_pages = 128; |
| 48 | static unsigned int user_freq = UINT_MAX; | 47 | static unsigned int user_freq = UINT_MAX; |
| @@ -58,7 +57,6 @@ static bool sample_id_all_avail = true; | |||
| 58 | static bool system_wide = false; | 57 | static bool system_wide = false; |
| 59 | static pid_t target_pid = -1; | 58 | static pid_t target_pid = -1; |
| 60 | static pid_t target_tid = -1; | 59 | static pid_t target_tid = -1; |
| 61 | static struct thread_map *threads; | ||
| 62 | static pid_t child_pid = -1; | 60 | static pid_t child_pid = -1; |
| 63 | static bool no_inherit = false; | 61 | static bool no_inherit = false; |
| 64 | static enum write_mode_t write_mode = WRITE_FORCE; | 62 | static enum write_mode_t write_mode = WRITE_FORCE; |
| @@ -189,7 +187,7 @@ static void create_counter(struct perf_evsel *evsel, int cpu) | |||
| 189 | int thread_index; | 187 | int thread_index; |
| 190 | int ret; | 188 | int ret; |
| 191 | 189 | ||
| 192 | for (thread_index = 0; thread_index < threads->nr; thread_index++) { | 190 | for (thread_index = 0; thread_index < evsel_list->threads->nr; thread_index++) { |
| 193 | h_attr = get_header_attr(attr, evsel->idx); | 191 | h_attr = get_header_attr(attr, evsel->idx); |
| 194 | if (h_attr == NULL) | 192 | if (h_attr == NULL) |
| 195 | die("nomem\n"); | 193 | die("nomem\n"); |
| @@ -317,7 +315,8 @@ static void open_counters(struct perf_evlist *evlist) | |||
| 317 | retry_sample_id: | 315 | retry_sample_id: |
| 318 | attr->sample_id_all = sample_id_all_avail ? 1 : 0; | 316 | attr->sample_id_all = sample_id_all_avail ? 1 : 0; |
| 319 | try_again: | 317 | try_again: |
| 320 | if (perf_evsel__open(pos, cpus, threads, group, !no_inherit) < 0) { | 318 | if (perf_evsel__open(pos, evlist->cpus, evlist->threads, group, |
| 319 | !no_inherit) < 0) { | ||
| 321 | int err = errno; | 320 | int err = errno; |
| 322 | 321 | ||
| 323 | if (err == EPERM || err == EACCES) | 322 | if (err == EPERM || err == EACCES) |
| @@ -368,10 +367,10 @@ try_again: | |||
| 368 | } | 367 | } |
| 369 | } | 368 | } |
| 370 | 369 | ||
| 371 | if (perf_evlist__mmap(evlist, cpus, threads, mmap_pages, false) < 0) | 370 | if (perf_evlist__mmap(evlist, mmap_pages, false) < 0) |
| 372 | die("failed to mmap with %d (%s)\n", errno, strerror(errno)); | 371 | die("failed to mmap with %d (%s)\n", errno, strerror(errno)); |
| 373 | 372 | ||
| 374 | for (cpu = 0; cpu < cpus->nr; ++cpu) { | 373 | for (cpu = 0; cpu < evsel_list->cpus->nr; ++cpu) { |
| 375 | list_for_each_entry(pos, &evlist->entries, node) | 374 | list_for_each_entry(pos, &evlist->entries, node) |
| 376 | create_counter(pos, cpu); | 375 | create_counter(pos, cpu); |
| 377 | } | 376 | } |
| @@ -450,7 +449,7 @@ static void mmap_read_all(void) | |||
| 450 | { | 449 | { |
| 451 | int i; | 450 | int i; |
| 452 | 451 | ||
| 453 | for (i = 0; i < cpus->nr; i++) { | 452 | for (i = 0; i < evsel_list->cpus->nr; i++) { |
| 454 | if (evsel_list->mmap[i].base) | 453 | if (evsel_list->mmap[i].base) |
| 455 | mmap_read(&evsel_list->mmap[i]); | 454 | mmap_read(&evsel_list->mmap[i]); |
| 456 | } | 455 | } |
| @@ -584,7 +583,7 @@ static int __cmd_record(int argc, const char **argv) | |||
| 584 | } | 583 | } |
| 585 | 584 | ||
| 586 | if (!system_wide && target_tid == -1 && target_pid == -1) | 585 | if (!system_wide && target_tid == -1 && target_pid == -1) |
| 587 | threads->map[0] = child_pid; | 586 | evsel_list->threads->map[0] = child_pid; |
| 588 | 587 | ||
| 589 | close(child_ready_pipe[1]); | 588 | close(child_ready_pipe[1]); |
| 590 | close(go_pipe[0]); | 589 | close(go_pipe[0]); |
| @@ -718,12 +717,12 @@ static int __cmd_record(int argc, const char **argv) | |||
| 718 | } | 717 | } |
| 719 | 718 | ||
| 720 | if (done) { | 719 | if (done) { |
| 721 | for (i = 0; i < cpus->nr; i++) { | 720 | for (i = 0; i < evsel_list->cpus->nr; i++) { |
| 722 | struct perf_evsel *pos; | 721 | struct perf_evsel *pos; |
| 723 | 722 | ||
| 724 | list_for_each_entry(pos, &evsel_list->entries, node) { | 723 | list_for_each_entry(pos, &evsel_list->entries, node) { |
| 725 | for (thread = 0; | 724 | for (thread = 0; |
| 726 | thread < threads->nr; | 725 | thread < evsel_list->threads->nr; |
| 727 | thread++) | 726 | thread++) |
| 728 | ioctl(FD(pos, i, thread), | 727 | ioctl(FD(pos, i, thread), |
| 729 | PERF_EVENT_IOC_DISABLE); | 728 | PERF_EVENT_IOC_DISABLE); |
| @@ -816,7 +815,7 @@ int cmd_record(int argc, const char **argv, const char *prefix __used) | |||
| 816 | int err = -ENOMEM; | 815 | int err = -ENOMEM; |
| 817 | struct perf_evsel *pos; | 816 | struct perf_evsel *pos; |
| 818 | 817 | ||
| 819 | evsel_list = perf_evlist__new(); | 818 | evsel_list = perf_evlist__new(NULL, NULL); |
| 820 | if (evsel_list == NULL) | 819 | if (evsel_list == NULL) |
| 821 | return -ENOMEM; | 820 | return -ENOMEM; |
| 822 | 821 | ||
| @@ -850,28 +849,19 @@ int cmd_record(int argc, const char **argv, const char *prefix __used) | |||
| 850 | if (target_pid != -1) | 849 | if (target_pid != -1) |
| 851 | target_tid = target_pid; | 850 | target_tid = target_pid; |
| 852 | 851 | ||
| 853 | threads = thread_map__new(target_pid, target_tid); | 852 | if (perf_evlist__create_maps(evsel_list, target_pid, |
| 854 | if (threads == NULL) { | 853 | target_tid, cpu_list) < 0) |
| 855 | pr_err("Problems finding threads of monitor\n"); | ||
| 856 | usage_with_options(record_usage, record_options); | ||
| 857 | } | ||
| 858 | |||
| 859 | if (target_tid != -1) | ||
| 860 | cpus = cpu_map__dummy_new(); | ||
| 861 | else | ||
| 862 | cpus = cpu_map__new(cpu_list); | ||
| 863 | |||
| 864 | if (cpus == NULL) | ||
| 865 | usage_with_options(record_usage, record_options); | 854 | usage_with_options(record_usage, record_options); |
| 866 | 855 | ||
| 867 | list_for_each_entry(pos, &evsel_list->entries, node) { | 856 | list_for_each_entry(pos, &evsel_list->entries, node) { |
| 868 | if (perf_evsel__alloc_fd(pos, cpus->nr, threads->nr) < 0) | 857 | if (perf_evsel__alloc_fd(pos, evsel_list->cpus->nr, |
| 858 | evsel_list->threads->nr) < 0) | ||
| 869 | goto out_free_fd; | 859 | goto out_free_fd; |
| 870 | if (perf_header__push_event(pos->attr.config, event_name(pos))) | 860 | if (perf_header__push_event(pos->attr.config, event_name(pos))) |
| 871 | goto out_free_fd; | 861 | goto out_free_fd; |
| 872 | } | 862 | } |
| 873 | 863 | ||
| 874 | if (perf_evlist__alloc_pollfd(evsel_list, cpus->nr, threads->nr) < 0) | 864 | if (perf_evlist__alloc_pollfd(evsel_list) < 0) |
| 875 | goto out_free_fd; | 865 | goto out_free_fd; |
| 876 | 866 | ||
| 877 | if (user_interval != ULLONG_MAX) | 867 | if (user_interval != ULLONG_MAX) |
| @@ -893,10 +883,8 @@ int cmd_record(int argc, const char **argv, const char *prefix __used) | |||
| 893 | } | 883 | } |
| 894 | 884 | ||
| 895 | err = __cmd_record(argc, argv); | 885 | err = __cmd_record(argc, argv); |
| 896 | |||
| 897 | out_free_fd: | 886 | out_free_fd: |
| 898 | thread_map__delete(threads); | 887 | perf_evlist__delete_maps(evsel_list); |
| 899 | threads = NULL; | ||
| 900 | out_symbol_exit: | 888 | out_symbol_exit: |
| 901 | symbol__exit(); | 889 | symbol__exit(); |
| 902 | return err; | 890 | return err; |
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 | } |
diff --git a/tools/perf/builtin-test.c b/tools/perf/builtin-test.c index 845b9bd54ed..1b2106c58f6 100644 --- a/tools/perf/builtin-test.c +++ b/tools/perf/builtin-test.c | |||
| @@ -509,7 +509,7 @@ static int test__basic_mmap(void) | |||
| 509 | goto out_free_cpus; | 509 | goto out_free_cpus; |
| 510 | } | 510 | } |
| 511 | 511 | ||
| 512 | evlist = perf_evlist__new(); | 512 | evlist = perf_evlist__new(cpus, threads); |
| 513 | if (evlist == NULL) { | 513 | if (evlist == NULL) { |
| 514 | pr_debug("perf_evlist__new\n"); | 514 | pr_debug("perf_evlist__new\n"); |
| 515 | goto out_free_cpus; | 515 | goto out_free_cpus; |
| @@ -537,7 +537,7 @@ static int test__basic_mmap(void) | |||
| 537 | } | 537 | } |
| 538 | } | 538 | } |
| 539 | 539 | ||
| 540 | if (perf_evlist__mmap(evlist, cpus, threads, 128, true) < 0) { | 540 | if (perf_evlist__mmap(evlist, 128, true) < 0) { |
| 541 | pr_debug("failed to mmap events: %d (%s)\n", errno, | 541 | pr_debug("failed to mmap events: %d (%s)\n", errno, |
| 542 | strerror(errno)); | 542 | strerror(errno)); |
| 543 | goto out_close_fd; | 543 | goto out_close_fd; |
| @@ -579,7 +579,7 @@ static int test__basic_mmap(void) | |||
| 579 | 579 | ||
| 580 | err = 0; | 580 | err = 0; |
| 581 | out_munmap: | 581 | out_munmap: |
| 582 | perf_evlist__munmap(evlist, 1); | 582 | perf_evlist__munmap(evlist); |
| 583 | out_close_fd: | 583 | out_close_fd: |
| 584 | for (i = 0; i < nsyscalls; ++i) | 584 | for (i = 0; i < nsyscalls; ++i) |
| 585 | perf_evsel__close_fd(evsels[i], 1, threads->nr); | 585 | perf_evsel__close_fd(evsels[i], 1, threads->nr); |
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 2f4d1f244be..599036b0673 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
| @@ -73,9 +73,7 @@ static int print_entries; | |||
| 73 | 73 | ||
| 74 | static int target_pid = -1; | 74 | static int target_pid = -1; |
| 75 | static int target_tid = -1; | 75 | static int target_tid = -1; |
| 76 | static struct thread_map *threads; | ||
| 77 | static bool inherit = false; | 76 | static bool inherit = false; |
| 78 | static struct cpu_map *cpus; | ||
| 79 | static int realtime_prio = 0; | 77 | static int realtime_prio = 0; |
| 80 | static bool group = false; | 78 | static bool group = false; |
| 81 | static unsigned int page_size; | 79 | static unsigned int page_size; |
| @@ -567,12 +565,13 @@ static void print_sym_table(struct perf_session *session) | |||
| 567 | printf(" (all"); | 565 | printf(" (all"); |
| 568 | 566 | ||
| 569 | if (cpu_list) | 567 | if (cpu_list) |
| 570 | printf(", CPU%s: %s)\n", cpus->nr > 1 ? "s" : "", cpu_list); | 568 | printf(", CPU%s: %s)\n", evsel_list->cpus->nr > 1 ? "s" : "", cpu_list); |
| 571 | else { | 569 | else { |
| 572 | if (target_tid != -1) | 570 | if (target_tid != -1) |
| 573 | printf(")\n"); | 571 | printf(")\n"); |
| 574 | else | 572 | else |
| 575 | printf(", %d CPU%s)\n", cpus->nr, cpus->nr > 1 ? "s" : ""); | 573 | printf(", %d CPU%s)\n", evsel_list->cpus->nr, |
| 574 | evsel_list->cpus->nr > 1 ? "s" : ""); | ||
| 576 | } | 575 | } |
| 577 | 576 | ||
| 578 | printf("%-*.*s\n", win_width, win_width, graph_dotted_line); | 577 | printf("%-*.*s\n", win_width, win_width, graph_dotted_line); |
| @@ -1124,7 +1123,7 @@ static void perf_session__mmap_read(struct perf_session *self) | |||
| 1124 | { | 1123 | { |
| 1125 | int i; | 1124 | int i; |
| 1126 | 1125 | ||
| 1127 | for (i = 0; i < cpus->nr; i++) | 1126 | for (i = 0; i < evsel_list->cpus->nr; i++) |
| 1128 | perf_session__mmap_read_cpu(self, i); | 1127 | perf_session__mmap_read_cpu(self, i); |
| 1129 | } | 1128 | } |
| 1130 | 1129 | ||
| @@ -1150,7 +1149,8 @@ static void start_counters(struct perf_evlist *evlist) | |||
| 1150 | 1149 | ||
| 1151 | attr->mmap = 1; | 1150 | attr->mmap = 1; |
| 1152 | try_again: | 1151 | try_again: |
| 1153 | if (perf_evsel__open(counter, cpus, threads, group, inherit) < 0) { | 1152 | if (perf_evsel__open(counter, evsel_list->cpus, |
| 1153 | evsel_list->threads, group, inherit) < 0) { | ||
| 1154 | int err = errno; | 1154 | int err = errno; |
| 1155 | 1155 | ||
| 1156 | if (err == EPERM || err == EACCES) | 1156 | if (err == EPERM || err == EACCES) |
| @@ -1181,7 +1181,7 @@ try_again: | |||
| 1181 | } | 1181 | } |
| 1182 | } | 1182 | } |
| 1183 | 1183 | ||
| 1184 | if (perf_evlist__mmap(evlist, cpus, threads, mmap_pages, false) < 0) | 1184 | if (perf_evlist__mmap(evlist, mmap_pages, false) < 0) |
| 1185 | die("failed to mmap with %d (%s)\n", errno, strerror(errno)); | 1185 | die("failed to mmap with %d (%s)\n", errno, strerror(errno)); |
| 1186 | } | 1186 | } |
| 1187 | 1187 | ||
| @@ -1296,7 +1296,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __used) | |||
| 1296 | struct perf_evsel *pos; | 1296 | struct perf_evsel *pos; |
| 1297 | int status = -ENOMEM; | 1297 | int status = -ENOMEM; |
| 1298 | 1298 | ||
| 1299 | evsel_list = perf_evlist__new(); | 1299 | evsel_list = perf_evlist__new(NULL, NULL); |
| 1300 | if (evsel_list == NULL) | 1300 | if (evsel_list == NULL) |
| 1301 | return -ENOMEM; | 1301 | return -ENOMEM; |
| 1302 | 1302 | ||
| @@ -1306,15 +1306,6 @@ int cmd_top(int argc, const char **argv, const char *prefix __used) | |||
| 1306 | if (argc) | 1306 | if (argc) |
| 1307 | usage_with_options(top_usage, options); | 1307 | usage_with_options(top_usage, options); |
| 1308 | 1308 | ||
| 1309 | if (target_pid != -1) | ||
| 1310 | target_tid = target_pid; | ||
| 1311 | |||
| 1312 | threads = thread_map__new(target_pid, target_tid); | ||
| 1313 | if (threads == NULL) { | ||
| 1314 | pr_err("Problems finding threads of monitor\n"); | ||
| 1315 | usage_with_options(top_usage, options); | ||
| 1316 | } | ||
| 1317 | |||
| 1318 | /* CPU and PID are mutually exclusive */ | 1309 | /* CPU and PID are mutually exclusive */ |
| 1319 | if (target_tid > 0 && cpu_list) { | 1310 | if (target_tid > 0 && cpu_list) { |
| 1320 | printf("WARNING: PID switch overriding CPU\n"); | 1311 | printf("WARNING: PID switch overriding CPU\n"); |
| @@ -1322,6 +1313,13 @@ int cmd_top(int argc, const char **argv, const char *prefix __used) | |||
| 1322 | cpu_list = NULL; | 1313 | cpu_list = NULL; |
| 1323 | } | 1314 | } |
| 1324 | 1315 | ||
| 1316 | if (target_pid != -1) | ||
| 1317 | target_tid = target_pid; | ||
| 1318 | |||
| 1319 | if (perf_evlist__create_maps(evsel_list, target_pid, | ||
| 1320 | target_tid, cpu_list) < 0) | ||
| 1321 | usage_with_options(top_usage, options); | ||
| 1322 | |||
| 1325 | if (!evsel_list->nr_entries && | 1323 | if (!evsel_list->nr_entries && |
| 1326 | perf_evlist__add_default(evsel_list) < 0) { | 1324 | perf_evlist__add_default(evsel_list) < 0) { |
| 1327 | pr_err("Not enough memory for event selector list\n"); | 1325 | pr_err("Not enough memory for event selector list\n"); |
| @@ -1343,16 +1341,9 @@ int cmd_top(int argc, const char **argv, const char *prefix __used) | |||
| 1343 | exit(EXIT_FAILURE); | 1341 | exit(EXIT_FAILURE); |
| 1344 | } | 1342 | } |
| 1345 | 1343 | ||
| 1346 | if (target_tid != -1) | ||
| 1347 | cpus = cpu_map__dummy_new(); | ||
| 1348 | else | ||
| 1349 | cpus = cpu_map__new(cpu_list); | ||
| 1350 | |||
| 1351 | if (cpus == NULL) | ||
| 1352 | usage_with_options(top_usage, options); | ||
| 1353 | |||
| 1354 | list_for_each_entry(pos, &evsel_list->entries, node) { | 1344 | list_for_each_entry(pos, &evsel_list->entries, node) { |
| 1355 | if (perf_evsel__alloc_fd(pos, cpus->nr, threads->nr) < 0) | 1345 | if (perf_evsel__alloc_fd(pos, evsel_list->cpus->nr, |
| 1346 | evsel_list->threads->nr) < 0) | ||
| 1356 | goto out_free_fd; | 1347 | goto out_free_fd; |
| 1357 | /* | 1348 | /* |
| 1358 | * Fill in the ones not specifically initialized via -c: | 1349 | * Fill in the ones not specifically initialized via -c: |
| @@ -1363,8 +1354,8 @@ int cmd_top(int argc, const char **argv, const char *prefix __used) | |||
| 1363 | pos->attr.sample_period = default_interval; | 1354 | pos->attr.sample_period = default_interval; |
| 1364 | } | 1355 | } |
| 1365 | 1356 | ||
| 1366 | if (perf_evlist__alloc_pollfd(evsel_list, cpus->nr, threads->nr) < 0 || | 1357 | if (perf_evlist__alloc_pollfd(evsel_list) < 0 || |
| 1367 | perf_evlist__alloc_mmap(evsel_list, cpus->nr) < 0) | 1358 | perf_evlist__alloc_mmap(evsel_list) < 0) |
| 1368 | goto out_free_fd; | 1359 | goto out_free_fd; |
| 1369 | 1360 | ||
| 1370 | sym_evsel = list_entry(evsel_list->entries.next, struct perf_evsel, node); | 1361 | sym_evsel = list_entry(evsel_list->entries.next, struct perf_evsel, node); |
diff --git a/tools/perf/python/twatch.py b/tools/perf/python/twatch.py index 5e9f3b7b7ee..df638c438a9 100755 --- a/tools/perf/python/twatch.py +++ b/tools/perf/python/twatch.py | |||
| @@ -23,9 +23,9 @@ def main(): | |||
| 23 | sample_id_all = 1, | 23 | sample_id_all = 1, |
| 24 | sample_type = perf.SAMPLE_PERIOD | perf.SAMPLE_TID | perf.SAMPLE_CPU | perf.SAMPLE_TID) | 24 | sample_type = perf.SAMPLE_PERIOD | perf.SAMPLE_TID | perf.SAMPLE_CPU | perf.SAMPLE_TID) |
| 25 | evsel.open(cpus = cpus, threads = threads); | 25 | evsel.open(cpus = cpus, threads = threads); |
| 26 | evlist = perf.evlist() | 26 | evlist = perf.evlist(cpus, threads) |
| 27 | evlist.add(evsel) | 27 | evlist.add(evsel) |
| 28 | evlist.mmap(cpus = cpus, threads = threads) | 28 | evlist.mmap() |
| 29 | while True: | 29 | while True: |
| 30 | evlist.poll(timeout = -1) | 30 | evlist.poll(timeout = -1) |
| 31 | for cpu in cpus: | 31 | for cpu in cpus: |
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index dcd59328bb4..95b21fece2c 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
| @@ -21,21 +21,24 @@ | |||
| 21 | #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) | 21 | #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) |
| 22 | #define SID(e, x, y) xyarray__entry(e->id, x, y) | 22 | #define SID(e, x, y) xyarray__entry(e->id, x, y) |
| 23 | 23 | ||
| 24 | void perf_evlist__init(struct perf_evlist *evlist) | 24 | void perf_evlist__init(struct perf_evlist *evlist, struct cpu_map *cpus, |
| 25 | struct thread_map *threads) | ||
| 25 | { | 26 | { |
| 26 | int i; | 27 | int i; |
| 27 | 28 | ||
| 28 | for (i = 0; i < PERF_EVLIST__HLIST_SIZE; ++i) | 29 | for (i = 0; i < PERF_EVLIST__HLIST_SIZE; ++i) |
| 29 | INIT_HLIST_HEAD(&evlist->heads[i]); | 30 | INIT_HLIST_HEAD(&evlist->heads[i]); |
| 30 | INIT_LIST_HEAD(&evlist->entries); | 31 | INIT_LIST_HEAD(&evlist->entries); |
| 32 | perf_evlist__set_maps(evlist, cpus, threads); | ||
| 31 | } | 33 | } |
| 32 | 34 | ||
| 33 | struct perf_evlist *perf_evlist__new(void) | 35 | struct perf_evlist *perf_evlist__new(struct cpu_map *cpus, |
| 36 | struct thread_map *threads) | ||
| 34 | { | 37 | { |
| 35 | struct perf_evlist *evlist = zalloc(sizeof(*evlist)); | 38 | struct perf_evlist *evlist = zalloc(sizeof(*evlist)); |
| 36 | 39 | ||
| 37 | if (evlist != NULL) | 40 | if (evlist != NULL) |
| 38 | perf_evlist__init(evlist); | 41 | perf_evlist__init(evlist, cpus, threads); |
| 39 | 42 | ||
| 40 | return evlist; | 43 | return evlist; |
| 41 | } | 44 | } |
| @@ -88,9 +91,9 @@ int perf_evlist__add_default(struct perf_evlist *evlist) | |||
| 88 | return 0; | 91 | return 0; |
| 89 | } | 92 | } |
| 90 | 93 | ||
| 91 | int perf_evlist__alloc_pollfd(struct perf_evlist *evlist, int ncpus, int nthreads) | 94 | int perf_evlist__alloc_pollfd(struct perf_evlist *evlist) |
| 92 | { | 95 | { |
| 93 | int nfds = ncpus * nthreads * evlist->nr_entries; | 96 | int nfds = evlist->cpus->nr * evlist->threads->nr * evlist->nr_entries; |
| 94 | evlist->pollfd = malloc(sizeof(struct pollfd) * nfds); | 97 | evlist->pollfd = malloc(sizeof(struct pollfd) * nfds); |
| 95 | return evlist->pollfd != NULL ? 0 : -ENOMEM; | 98 | return evlist->pollfd != NULL ? 0 : -ENOMEM; |
| 96 | } | 99 | } |
| @@ -213,11 +216,11 @@ union perf_event *perf_evlist__read_on_cpu(struct perf_evlist *evlist, int cpu) | |||
| 213 | return event; | 216 | return event; |
| 214 | } | 217 | } |
| 215 | 218 | ||
| 216 | void perf_evlist__munmap(struct perf_evlist *evlist, int ncpus) | 219 | void perf_evlist__munmap(struct perf_evlist *evlist) |
| 217 | { | 220 | { |
| 218 | int cpu; | 221 | int cpu; |
| 219 | 222 | ||
| 220 | for (cpu = 0; cpu < ncpus; cpu++) { | 223 | for (cpu = 0; cpu < evlist->cpus->nr; cpu++) { |
| 221 | if (evlist->mmap[cpu].base != NULL) { | 224 | if (evlist->mmap[cpu].base != NULL) { |
| 222 | munmap(evlist->mmap[cpu].base, evlist->mmap_len); | 225 | munmap(evlist->mmap[cpu].base, evlist->mmap_len); |
| 223 | evlist->mmap[cpu].base = NULL; | 226 | evlist->mmap[cpu].base = NULL; |
| @@ -225,9 +228,9 @@ void perf_evlist__munmap(struct perf_evlist *evlist, int ncpus) | |||
| 225 | } | 228 | } |
| 226 | } | 229 | } |
| 227 | 230 | ||
| 228 | int perf_evlist__alloc_mmap(struct perf_evlist *evlist, int ncpus) | 231 | int perf_evlist__alloc_mmap(struct perf_evlist *evlist) |
| 229 | { | 232 | { |
| 230 | evlist->mmap = zalloc(ncpus * sizeof(struct perf_mmap)); | 233 | evlist->mmap = zalloc(evlist->cpus->nr * sizeof(struct perf_mmap)); |
| 231 | return evlist->mmap != NULL ? 0 : -ENOMEM; | 234 | return evlist->mmap != NULL ? 0 : -ENOMEM; |
| 232 | } | 235 | } |
| 233 | 236 | ||
| @@ -248,8 +251,6 @@ static int __perf_evlist__mmap(struct perf_evlist *evlist, int cpu, int prot, | |||
| 248 | /** perf_evlist__mmap - Create per cpu maps to receive events | 251 | /** perf_evlist__mmap - Create per cpu maps to receive events |
| 249 | * | 252 | * |
| 250 | * @evlist - list of events | 253 | * @evlist - list of events |
| 251 | * @cpus - cpu map being monitored | ||
| 252 | * @threads - threads map being monitored | ||
| 253 | * @pages - map length in pages | 254 | * @pages - map length in pages |
| 254 | * @overwrite - overwrite older events? | 255 | * @overwrite - overwrite older events? |
| 255 | * | 256 | * |
| @@ -259,21 +260,22 @@ static int __perf_evlist__mmap(struct perf_evlist *evlist, int cpu, int prot, | |||
| 259 | * unsigned int head = perf_mmap__read_head(m); | 260 | * unsigned int head = perf_mmap__read_head(m); |
| 260 | * | 261 | * |
| 261 | * perf_mmap__write_tail(m, head) | 262 | * perf_mmap__write_tail(m, head) |
| 263 | * | ||
| 264 | * Using perf_evlist__read_on_cpu does this automatically. | ||
| 262 | */ | 265 | */ |
| 263 | int perf_evlist__mmap(struct perf_evlist *evlist, struct cpu_map *cpus, | 266 | int perf_evlist__mmap(struct perf_evlist *evlist, int pages, bool overwrite) |
| 264 | struct thread_map *threads, int pages, bool overwrite) | ||
| 265 | { | 267 | { |
| 266 | unsigned int page_size = sysconf(_SC_PAGE_SIZE); | 268 | unsigned int page_size = sysconf(_SC_PAGE_SIZE); |
| 267 | int mask = pages * page_size - 1, cpu; | 269 | int mask = pages * page_size - 1, cpu; |
| 268 | struct perf_evsel *first_evsel, *evsel; | 270 | struct perf_evsel *first_evsel, *evsel; |
| 271 | const struct cpu_map *cpus = evlist->cpus; | ||
| 272 | const struct thread_map *threads = evlist->threads; | ||
| 269 | int thread, prot = PROT_READ | (overwrite ? 0 : PROT_WRITE); | 273 | int thread, prot = PROT_READ | (overwrite ? 0 : PROT_WRITE); |
| 270 | 274 | ||
| 271 | if (evlist->mmap == NULL && | 275 | if (evlist->mmap == NULL && perf_evlist__alloc_mmap(evlist) < 0) |
| 272 | perf_evlist__alloc_mmap(evlist, cpus->nr) < 0) | ||
| 273 | return -ENOMEM; | 276 | return -ENOMEM; |
| 274 | 277 | ||
| 275 | if (evlist->pollfd == NULL && | 278 | if (evlist->pollfd == NULL && perf_evlist__alloc_pollfd(evlist) < 0) |
| 276 | perf_evlist__alloc_pollfd(evlist, cpus->nr, threads->nr) < 0) | ||
| 277 | return -ENOMEM; | 279 | return -ENOMEM; |
| 278 | 280 | ||
| 279 | evlist->overwrite = overwrite; | 281 | evlist->overwrite = overwrite; |
| @@ -315,3 +317,34 @@ out_unmap: | |||
| 315 | } | 317 | } |
| 316 | return -1; | 318 | return -1; |
| 317 | } | 319 | } |
| 320 | |||
| 321 | int perf_evlist__create_maps(struct perf_evlist *evlist, pid_t target_pid, | ||
| 322 | pid_t target_tid, const char *cpu_list) | ||
| 323 | { | ||
| 324 | evlist->threads = thread_map__new(target_pid, target_tid); | ||
| 325 | |||
| 326 | if (evlist->threads == NULL) | ||
| 327 | return -1; | ||
| 328 | |||
| 329 | if (target_tid != -1) | ||
| 330 | evlist->cpus = cpu_map__dummy_new(); | ||
| 331 | else | ||
| 332 | evlist->cpus = cpu_map__new(cpu_list); | ||
| 333 | |||
| 334 | if (evlist->cpus == NULL) | ||
| 335 | goto out_delete_threads; | ||
| 336 | |||
| 337 | return 0; | ||
| 338 | |||
| 339 | out_delete_threads: | ||
| 340 | thread_map__delete(evlist->threads); | ||
| 341 | return -1; | ||
| 342 | } | ||
| 343 | |||
| 344 | void perf_evlist__delete_maps(struct perf_evlist *evlist) | ||
| 345 | { | ||
| 346 | cpu_map__delete(evlist->cpus); | ||
| 347 | thread_map__delete(evlist->threads); | ||
| 348 | evlist->cpus = NULL; | ||
| 349 | evlist->threads = NULL; | ||
| 350 | } | ||
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index 85aca6eba16..c9884056097 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h | |||
| @@ -22,28 +22,43 @@ struct perf_evlist { | |||
| 22 | union perf_event event_copy; | 22 | union perf_event event_copy; |
| 23 | struct perf_mmap *mmap; | 23 | struct perf_mmap *mmap; |
| 24 | struct pollfd *pollfd; | 24 | struct pollfd *pollfd; |
| 25 | struct thread_map *threads; | ||
| 26 | struct cpu_map *cpus; | ||
| 25 | }; | 27 | }; |
| 26 | 28 | ||
| 27 | struct perf_evsel; | 29 | struct perf_evsel; |
| 28 | 30 | ||
| 29 | struct perf_evlist *perf_evlist__new(void); | 31 | struct perf_evlist *perf_evlist__new(struct cpu_map *cpus, |
| 30 | void perf_evlist__init(struct perf_evlist *evlist); | 32 | struct thread_map *threads); |
| 33 | void perf_evlist__init(struct perf_evlist *evlist, struct cpu_map *cpus, | ||
| 34 | struct thread_map *threads); | ||
| 31 | void perf_evlist__exit(struct perf_evlist *evlist); | 35 | void perf_evlist__exit(struct perf_evlist *evlist); |
| 32 | void perf_evlist__delete(struct perf_evlist *evlist); | 36 | void perf_evlist__delete(struct perf_evlist *evlist); |
| 33 | 37 | ||
| 34 | void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry); | 38 | void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry); |
| 35 | int perf_evlist__add_default(struct perf_evlist *evlist); | 39 | int perf_evlist__add_default(struct perf_evlist *evlist); |
| 36 | 40 | ||
| 37 | int perf_evlist__alloc_pollfd(struct perf_evlist *evlist, int ncpus, int nthreads); | 41 | int perf_evlist__alloc_pollfd(struct perf_evlist *evlist); |
| 38 | void perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd); | 42 | void perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd); |
| 39 | 43 | ||
| 40 | struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id); | 44 | struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id); |
| 41 | 45 | ||
| 42 | union perf_event *perf_evlist__read_on_cpu(struct perf_evlist *self, int cpu); | 46 | union perf_event *perf_evlist__read_on_cpu(struct perf_evlist *self, int cpu); |
| 43 | 47 | ||
| 44 | int perf_evlist__alloc_mmap(struct perf_evlist *evlist, int ncpus); | 48 | int perf_evlist__alloc_mmap(struct perf_evlist *evlist); |
| 45 | int perf_evlist__mmap(struct perf_evlist *evlist, struct cpu_map *cpus, | 49 | int perf_evlist__mmap(struct perf_evlist *evlist, int pages, bool overwrite); |
| 46 | struct thread_map *threads, int pages, bool overwrite); | 50 | void perf_evlist__munmap(struct perf_evlist *evlist); |
| 47 | void perf_evlist__munmap(struct perf_evlist *evlist, int ncpus); | 51 | |
| 52 | static inline void perf_evlist__set_maps(struct perf_evlist *evlist, | ||
| 53 | struct cpu_map *cpus, | ||
| 54 | struct thread_map *threads) | ||
| 55 | { | ||
| 56 | evlist->cpus = cpus; | ||
| 57 | evlist->threads = threads; | ||
| 58 | } | ||
| 59 | |||
| 60 | int perf_evlist__create_maps(struct perf_evlist *evlist, pid_t target_pid, | ||
| 61 | pid_t target_tid, const char *cpu_list); | ||
| 62 | void perf_evlist__delete_maps(struct perf_evlist *evlist); | ||
| 48 | 63 | ||
| 49 | #endif /* __PERF_EVLIST_H */ | 64 | #endif /* __PERF_EVLIST_H */ |
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c index 88d47895a79..d2d52175362 100644 --- a/tools/perf/util/python.c +++ b/tools/perf/util/python.c | |||
| @@ -553,7 +553,16 @@ struct pyrf_evlist { | |||
| 553 | static int pyrf_evlist__init(struct pyrf_evlist *pevlist, | 553 | static int pyrf_evlist__init(struct pyrf_evlist *pevlist, |
| 554 | PyObject *args, PyObject *kwargs) | 554 | PyObject *args, PyObject *kwargs) |
| 555 | { | 555 | { |
| 556 | perf_evlist__init(&pevlist->evlist); | 556 | PyObject *pcpus = NULL, *pthreads = NULL; |
| 557 | struct cpu_map *cpus; | ||
| 558 | struct thread_map *threads; | ||
| 559 | |||
| 560 | if (!PyArg_ParseTuple(args, "OO", &pcpus, &pthreads)) | ||
| 561 | return -1; | ||
| 562 | |||
| 563 | threads = ((struct pyrf_thread_map *)pthreads)->threads; | ||
| 564 | cpus = ((struct pyrf_cpu_map *)pcpus)->cpus; | ||
| 565 | perf_evlist__init(&pevlist->evlist, cpus, threads); | ||
| 557 | return 0; | 566 | return 0; |
| 558 | } | 567 | } |
| 559 | 568 | ||
| @@ -567,21 +576,15 @@ static PyObject *pyrf_evlist__mmap(struct pyrf_evlist *pevlist, | |||
| 567 | PyObject *args, PyObject *kwargs) | 576 | PyObject *args, PyObject *kwargs) |
| 568 | { | 577 | { |
| 569 | struct perf_evlist *evlist = &pevlist->evlist; | 578 | struct perf_evlist *evlist = &pevlist->evlist; |
| 570 | PyObject *pcpus = NULL, *pthreads = NULL; | 579 | static char *kwlist[] = {"pages", "overwrite", |
| 571 | struct cpu_map *cpus = NULL; | ||
| 572 | struct thread_map *threads = NULL; | ||
| 573 | static char *kwlist[] = {"cpus", "threads", "pages", "overwrite", | ||
| 574 | NULL, NULL}; | 580 | NULL, NULL}; |
| 575 | int pages = 128, overwrite = false; | 581 | int pages = 128, overwrite = false; |
| 576 | 582 | ||
| 577 | if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|ii", kwlist, | 583 | if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ii", kwlist, |
| 578 | &pcpus, &pthreads, &pages, &overwrite)) | 584 | &pages, &overwrite)) |
| 579 | return NULL; | 585 | return NULL; |
| 580 | 586 | ||
| 581 | threads = ((struct pyrf_thread_map *)pthreads)->threads; | 587 | if (perf_evlist__mmap(evlist, pages, overwrite) < 0) { |
| 582 | cpus = ((struct pyrf_cpu_map *)pcpus)->cpus; | ||
| 583 | |||
| 584 | if (perf_evlist__mmap(evlist, cpus, threads, pages, overwrite) < 0) { | ||
| 585 | PyErr_SetFromErrno(PyExc_OSError); | 588 | PyErr_SetFromErrno(PyExc_OSError); |
| 586 | return NULL; | 589 | return NULL; |
| 587 | } | 590 | } |
