diff options
| -rw-r--r-- | tools/perf/Makefile | 2 | ||||
| -rw-r--r-- | tools/perf/builtin-annotate.c | 63 | ||||
| -rw-r--r-- | tools/perf/builtin-kmem.c | 33 | ||||
| -rw-r--r-- | tools/perf/builtin-report.c | 72 | ||||
| -rw-r--r-- | tools/perf/builtin-sched.c | 42 | ||||
| -rw-r--r-- | tools/perf/builtin-top.c | 19 | ||||
| -rw-r--r-- | tools/perf/builtin-trace.c | 40 | ||||
| -rw-r--r-- | tools/perf/util/data_map.c | 56 | ||||
| -rw-r--r-- | tools/perf/util/data_map.h | 2 | ||||
| -rw-r--r-- | tools/perf/util/event.c | 74 | ||||
| -rw-r--r-- | tools/perf/util/event.h | 17 | ||||
| -rw-r--r-- | tools/perf/util/hist.c | 7 | ||||
| -rw-r--r-- | tools/perf/util/process_event.c | 53 | ||||
| -rw-r--r-- | tools/perf/util/process_event.h | 29 | ||||
| -rw-r--r-- | tools/perf/util/process_events.c | 64 | ||||
| -rw-r--r-- | tools/perf/util/process_events.h | 35 |
16 files changed, 183 insertions, 425 deletions
diff --git a/tools/perf/Makefile b/tools/perf/Makefile index de37d492e10f..f1537a94a05f 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile | |||
| @@ -369,7 +369,6 @@ LIB_H += util/sort.h | |||
| 369 | LIB_H += util/hist.h | 369 | LIB_H += util/hist.h |
| 370 | LIB_H += util/thread.h | 370 | LIB_H += util/thread.h |
| 371 | LIB_H += util/data_map.h | 371 | LIB_H += util/data_map.h |
| 372 | LIB_H += util/process_events.h | ||
| 373 | 372 | ||
| 374 | LIB_OBJS += util/abspath.o | 373 | LIB_OBJS += util/abspath.o |
| 375 | LIB_OBJS += util/alias.o | 374 | LIB_OBJS += util/alias.o |
| @@ -412,7 +411,6 @@ LIB_OBJS += util/svghelper.o | |||
| 412 | LIB_OBJS += util/sort.o | 411 | LIB_OBJS += util/sort.o |
| 413 | LIB_OBJS += util/hist.o | 412 | LIB_OBJS += util/hist.o |
| 414 | LIB_OBJS += util/data_map.o | 413 | LIB_OBJS += util/data_map.o |
| 415 | LIB_OBJS += util/process_events.o | ||
| 416 | 414 | ||
| 417 | BUILTIN_OBJS += builtin-annotate.o | 415 | BUILTIN_OBJS += builtin-annotate.o |
| 418 | 416 | ||
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index 3ebd70b1ef93..7d39bd2b19b8 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c | |||
| @@ -19,12 +19,12 @@ | |||
| 19 | #include "perf.h" | 19 | #include "perf.h" |
| 20 | #include "util/debug.h" | 20 | #include "util/debug.h" |
| 21 | 21 | ||
| 22 | #include "util/event.h" | ||
| 22 | #include "util/parse-options.h" | 23 | #include "util/parse-options.h" |
| 23 | #include "util/parse-events.h" | 24 | #include "util/parse-events.h" |
| 24 | #include "util/thread.h" | 25 | #include "util/thread.h" |
| 25 | #include "util/sort.h" | 26 | #include "util/sort.h" |
| 26 | #include "util/hist.h" | 27 | #include "util/hist.h" |
| 27 | #include "util/process_events.h" | ||
| 28 | 28 | ||
| 29 | static char const *input_name = "perf.data"; | 29 | static char const *input_name = "perf.data"; |
| 30 | 30 | ||
| @@ -136,8 +136,7 @@ static int hist_entry__add(struct thread *thread, struct map *map, | |||
| 136 | return 0; | 136 | return 0; |
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | static int | 139 | static int process_sample_event(event_t *event) |
| 140 | process_sample_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 141 | { | 140 | { |
| 142 | char level; | 141 | char level; |
| 143 | u64 ip = event->ip.ip; | 142 | u64 ip = event->ip.ip; |
| @@ -145,12 +144,8 @@ process_sample_event(event_t *event, unsigned long offset, unsigned long head) | |||
| 145 | struct symbol *sym = NULL; | 144 | struct symbol *sym = NULL; |
| 146 | struct thread *thread = threads__findnew(event->ip.pid); | 145 | struct thread *thread = threads__findnew(event->ip.pid); |
| 147 | 146 | ||
| 148 | dump_printf("%p [%p]: PERF_EVENT (IP, %d): %d: %p\n", | 147 | dump_printf("(IP, %d): %d: %p\n", event->header.misc, |
| 149 | (void *)(offset + head), | 148 | event->ip.pid, (void *)(long)ip); |
| 150 | (void *)(long)(event->header.size), | ||
| 151 | event->header.misc, | ||
| 152 | event->ip.pid, | ||
| 153 | (void *)(long)ip); | ||
| 154 | 149 | ||
| 155 | if (thread == NULL) { | 150 | if (thread == NULL) { |
| 156 | fprintf(stderr, "problem processing %d event, skipping it.\n", | 151 | fprintf(stderr, "problem processing %d event, skipping it.\n", |
| @@ -198,46 +193,24 @@ process_sample_event(event_t *event, unsigned long offset, unsigned long head) | |||
| 198 | "skipping event\n"); | 193 | "skipping event\n"); |
| 199 | return -1; | 194 | return -1; |
| 200 | } | 195 | } |
| 201 | total++; | ||
| 202 | 196 | ||
| 203 | return 0; | 197 | return 0; |
| 204 | } | 198 | } |
| 205 | 199 | ||
| 206 | static int | 200 | static int event__process(event_t *self) |
| 207 | process_comm_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 208 | { | 201 | { |
| 209 | struct thread *thread = threads__findnew(event->comm.pid); | 202 | switch (self->header.type) { |
| 210 | |||
| 211 | dump_printf("%p [%p]: PERF_RECORD_COMM: %s:%d\n", | ||
| 212 | (void *)(offset + head), | ||
| 213 | (void *)(long)(event->header.size), | ||
| 214 | event->comm.comm, event->comm.pid); | ||
| 215 | |||
| 216 | if (thread == NULL || | ||
| 217 | thread__set_comm(thread, event->comm.comm)) { | ||
| 218 | dump_printf("problem processing PERF_RECORD_COMM, skipping event.\n"); | ||
| 219 | return -1; | ||
| 220 | } | ||
| 221 | total_comm++; | ||
| 222 | |||
| 223 | return 0; | ||
| 224 | } | ||
| 225 | |||
| 226 | static int | ||
| 227 | process_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 228 | { | ||
| 229 | switch (event->header.type) { | ||
| 230 | case PERF_RECORD_SAMPLE: | 203 | case PERF_RECORD_SAMPLE: |
| 231 | return process_sample_event(event, offset, head); | 204 | return process_sample_event(self); |
| 232 | 205 | ||
| 233 | case PERF_RECORD_MMAP: | 206 | case PERF_RECORD_MMAP: |
| 234 | return process_mmap_event(event, offset, head); | 207 | return event__process_mmap(self); |
| 235 | 208 | ||
| 236 | case PERF_RECORD_COMM: | 209 | case PERF_RECORD_COMM: |
| 237 | return process_comm_event(event, offset, head); | 210 | return event__process_comm(self); |
| 238 | 211 | ||
| 239 | case PERF_RECORD_FORK: | 212 | case PERF_RECORD_FORK: |
| 240 | return process_task_event(event, offset, head); | 213 | return event__process_task(self); |
| 241 | /* | 214 | /* |
| 242 | * We dont process them right now but they are fine: | 215 | * We dont process them right now but they are fine: |
| 243 | */ | 216 | */ |
| @@ -621,15 +594,12 @@ more: | |||
| 621 | (void *)(long)event->header.size, | 594 | (void *)(long)event->header.size, |
| 622 | event->header.type); | 595 | event->header.type); |
| 623 | 596 | ||
| 624 | if (!size || process_event(event, offset, head) < 0) { | 597 | if (!size || event__process(event) < 0) { |
| 625 | 598 | ||
| 626 | dump_printf("%p [%p]: skipping unknown header type: %d\n", | 599 | dump_printf("%p [%p]: skipping unknown header type: %d\n", |
| 627 | (void *)(offset + head), | 600 | (void *)(offset + head), |
| 628 | (void *)(long)(event->header.size), | 601 | (void *)(long)(event->header.size), |
| 629 | event->header.type); | 602 | event->header.type); |
| 630 | |||
| 631 | total_unknown++; | ||
| 632 | |||
| 633 | /* | 603 | /* |
| 634 | * assume we lost track of the stream, check alignment, and | 604 | * assume we lost track of the stream, check alignment, and |
| 635 | * increment a single u64 in the hope to catch on again 'soon'. | 605 | * increment a single u64 in the hope to catch on again 'soon'. |
| @@ -649,14 +619,11 @@ more: | |||
| 649 | rc = EXIT_SUCCESS; | 619 | rc = EXIT_SUCCESS; |
| 650 | close(input); | 620 | close(input); |
| 651 | 621 | ||
| 652 | dump_printf(" IP events: %10ld\n", total); | ||
| 653 | dump_printf(" mmap events: %10ld\n", total_mmap); | ||
| 654 | dump_printf(" comm events: %10ld\n", total_comm); | ||
| 655 | dump_printf(" fork events: %10ld\n", total_fork); | ||
| 656 | dump_printf(" unknown events: %10ld\n", total_unknown); | ||
| 657 | 622 | ||
| 658 | if (dump_trace) | 623 | if (dump_trace) { |
| 624 | event__print_totals(); | ||
| 659 | return 0; | 625 | return 0; |
| 626 | } | ||
| 660 | 627 | ||
| 661 | if (verbose > 3) | 628 | if (verbose > 3) |
| 662 | threads__fprintf(stdout); | 629 | threads__fprintf(stdout); |
| @@ -665,7 +632,7 @@ more: | |||
| 665 | dsos__fprintf(stdout); | 632 | dsos__fprintf(stdout); |
| 666 | 633 | ||
| 667 | collapse__resort(); | 634 | collapse__resort(); |
| 668 | output__resort(total); | 635 | output__resort(event__total[0]); |
| 669 | 636 | ||
| 670 | find_annotations(); | 637 | find_annotations(); |
| 671 | 638 | ||
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index 35722fafc4d1..e7294c8fc620 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c | |||
| @@ -33,9 +33,6 @@ static bool raw_ip; | |||
| 33 | 33 | ||
| 34 | static char default_sort_order[] = "frag,hit,bytes"; | 34 | static char default_sort_order[] = "frag,hit,bytes"; |
| 35 | 35 | ||
| 36 | static char *cwd; | ||
| 37 | static int cwdlen; | ||
| 38 | |||
| 39 | static int *cpunode_map; | 36 | static int *cpunode_map; |
| 40 | static int max_cpu_num; | 37 | static int max_cpu_num; |
| 41 | 38 | ||
| @@ -126,25 +123,6 @@ static void setup_cpunode_map(void) | |||
| 126 | } | 123 | } |
| 127 | } | 124 | } |
| 128 | 125 | ||
| 129 | static int | ||
| 130 | process_comm_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 131 | { | ||
| 132 | struct thread *thread = threads__findnew(event->comm.pid); | ||
| 133 | |||
| 134 | dump_printf("%p [%p]: PERF_RECORD_COMM: %s:%d\n", | ||
| 135 | (void *)(offset + head), | ||
| 136 | (void *)(long)(event->header.size), | ||
| 137 | event->comm.comm, event->comm.pid); | ||
| 138 | |||
| 139 | if (thread == NULL || | ||
| 140 | thread__set_comm(thread, event->comm.comm)) { | ||
| 141 | dump_printf("problem processing PERF_RECORD_COMM, skipping event.\n"); | ||
| 142 | return -1; | ||
| 143 | } | ||
| 144 | |||
| 145 | return 0; | ||
| 146 | } | ||
| 147 | |||
| 148 | static void insert_alloc_stat(unsigned long call_site, unsigned long ptr, | 126 | static void insert_alloc_stat(unsigned long call_site, unsigned long ptr, |
| 149 | int bytes_req, int bytes_alloc, int cpu) | 127 | int bytes_req, int bytes_alloc, int cpu) |
| 150 | { | 128 | { |
| @@ -340,8 +318,7 @@ process_raw_event(event_t *raw_event __used, void *more_data, | |||
| 340 | } | 318 | } |
| 341 | } | 319 | } |
| 342 | 320 | ||
| 343 | static int | 321 | static int process_sample_event(event_t *event) |
| 344 | process_sample_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 345 | { | 322 | { |
| 346 | u64 ip = event->ip.ip; | 323 | u64 ip = event->ip.ip; |
| 347 | u64 timestamp = -1; | 324 | u64 timestamp = -1; |
| @@ -366,9 +343,7 @@ process_sample_event(event_t *event, unsigned long offset, unsigned long head) | |||
| 366 | more_data += sizeof(u64); | 343 | more_data += sizeof(u64); |
| 367 | } | 344 | } |
| 368 | 345 | ||
| 369 | dump_printf("%p [%p]: PERF_RECORD_SAMPLE (IP, %d): %d/%d: %p period: %Ld\n", | 346 | dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", |
| 370 | (void *)(offset + head), | ||
| 371 | (void *)(long)(event->header.size), | ||
| 372 | event->header.misc, | 347 | event->header.misc, |
| 373 | event->ip.pid, event->ip.tid, | 348 | event->ip.pid, event->ip.tid, |
| 374 | (void *)(long)ip, | 349 | (void *)(long)ip, |
| @@ -403,7 +378,7 @@ static int sample_type_check(u64 type) | |||
| 403 | 378 | ||
| 404 | static struct perf_file_handler file_handler = { | 379 | static struct perf_file_handler file_handler = { |
| 405 | .process_sample_event = process_sample_event, | 380 | .process_sample_event = process_sample_event, |
| 406 | .process_comm_event = process_comm_event, | 381 | .process_comm_event = event__process_comm, |
| 407 | .sample_type_check = sample_type_check, | 382 | .sample_type_check = sample_type_check, |
| 408 | }; | 383 | }; |
| 409 | 384 | ||
| @@ -413,7 +388,7 @@ static int read_events(void) | |||
| 413 | register_perf_file_handler(&file_handler); | 388 | register_perf_file_handler(&file_handler); |
| 414 | 389 | ||
| 415 | return mmap_dispatch_perf_file(&header, input_name, 0, 0, | 390 | return mmap_dispatch_perf_file(&header, input_name, 0, 0, |
| 416 | &cwdlen, &cwd); | 391 | &event__cwdlen, &event__cwd); |
| 417 | } | 392 | } |
| 418 | 393 | ||
| 419 | static double fragmentation(unsigned long n_req, unsigned long n_alloc) | 394 | static double fragmentation(unsigned long n_req, unsigned long n_alloc) |
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 9bd20c2ee3dd..01ef35cac5f9 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
| @@ -30,7 +30,6 @@ | |||
| 30 | #include "util/thread.h" | 30 | #include "util/thread.h" |
| 31 | #include "util/sort.h" | 31 | #include "util/sort.h" |
| 32 | #include "util/hist.h" | 32 | #include "util/hist.h" |
| 33 | #include "util/process_events.h" | ||
| 34 | 33 | ||
| 35 | static char const *input_name = "perf.data"; | 34 | static char const *input_name = "perf.data"; |
| 36 | 35 | ||
| @@ -655,8 +654,7 @@ static int validate_chain(struct ip_callchain *chain, event_t *event) | |||
| 655 | return 0; | 654 | return 0; |
| 656 | } | 655 | } |
| 657 | 656 | ||
| 658 | static int | 657 | static int process_sample_event(event_t *event) |
| 659 | process_sample_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 660 | { | 658 | { |
| 661 | char level; | 659 | char level; |
| 662 | struct symbol *sym = NULL; | 660 | struct symbol *sym = NULL; |
| @@ -673,9 +671,7 @@ process_sample_event(event_t *event, unsigned long offset, unsigned long head) | |||
| 673 | more_data += sizeof(u64); | 671 | more_data += sizeof(u64); |
| 674 | } | 672 | } |
| 675 | 673 | ||
| 676 | dump_printf("%p [%p]: PERF_RECORD_SAMPLE (IP, %d): %d/%d: %p period: %Ld\n", | 674 | dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", |
| 677 | (void *)(offset + head), | ||
| 678 | (void *)(long)(event->header.size), | ||
| 679 | event->header.misc, | 675 | event->header.misc, |
| 680 | event->ip.pid, event->ip.tid, | 676 | event->ip.pid, event->ip.tid, |
| 681 | (void *)(long)ip, | 677 | (void *)(long)ip, |
| @@ -743,47 +739,27 @@ process_sample_event(event_t *event, unsigned long offset, unsigned long head) | |||
| 743 | return -1; | 739 | return -1; |
| 744 | } | 740 | } |
| 745 | 741 | ||
| 746 | total += period; | 742 | event__stats.total += period; |
| 747 | 743 | ||
| 748 | return 0; | 744 | return 0; |
| 749 | } | 745 | } |
| 750 | 746 | ||
| 751 | static int | 747 | static int process_comm_event(event_t *event) |
| 752 | process_comm_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 753 | { | 748 | { |
| 754 | struct thread *thread = threads__findnew(event->comm.pid); | 749 | struct thread *thread = threads__findnew(event->comm.pid); |
| 755 | 750 | ||
| 756 | dump_printf("%p [%p]: PERF_RECORD_COMM: %s:%d\n", | 751 | dump_printf(": %s:%d\n", event->comm.comm, event->comm.pid); |
| 757 | (void *)(offset + head), | ||
| 758 | (void *)(long)(event->header.size), | ||
| 759 | event->comm.comm, event->comm.pid); | ||
| 760 | 752 | ||
| 761 | if (thread == NULL || | 753 | if (thread == NULL || |
| 762 | thread__set_comm_adjust(thread, event->comm.comm)) { | 754 | thread__set_comm_adjust(thread, event->comm.comm)) { |
| 763 | dump_printf("problem processing PERF_RECORD_COMM, skipping event.\n"); | 755 | dump_printf("problem processing PERF_RECORD_COMM, skipping event.\n"); |
| 764 | return -1; | 756 | return -1; |
| 765 | } | 757 | } |
| 766 | total_comm++; | ||
| 767 | |||
| 768 | return 0; | ||
| 769 | } | ||
| 770 | |||
| 771 | static int | ||
| 772 | process_lost_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 773 | { | ||
| 774 | dump_printf("%p [%p]: PERF_RECORD_LOST: id:%Ld: lost:%Ld\n", | ||
| 775 | (void *)(offset + head), | ||
| 776 | (void *)(long)(event->header.size), | ||
| 777 | event->lost.id, | ||
| 778 | event->lost.lost); | ||
| 779 | |||
| 780 | total_lost += event->lost.lost; | ||
| 781 | 758 | ||
| 782 | return 0; | 759 | return 0; |
| 783 | } | 760 | } |
| 784 | 761 | ||
| 785 | static int | 762 | static int process_read_event(event_t *event) |
| 786 | process_read_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 787 | { | 763 | { |
| 788 | struct perf_event_attr *attr; | 764 | struct perf_event_attr *attr; |
| 789 | 765 | ||
| @@ -799,14 +775,9 @@ process_read_event(event_t *event, unsigned long offset, unsigned long head) | |||
| 799 | event->read.value); | 775 | event->read.value); |
| 800 | } | 776 | } |
| 801 | 777 | ||
| 802 | dump_printf("%p [%p]: PERF_RECORD_READ: %d %d %s %Lu\n", | 778 | dump_printf(": %d %d %s %Lu\n", event->read.pid, event->read.tid, |
| 803 | (void *)(offset + head), | 779 | attr ? __event_name(attr->type, attr->config) : "FAIL", |
| 804 | (void *)(long)(event->header.size), | 780 | event->read.value); |
| 805 | event->read.pid, | ||
| 806 | event->read.tid, | ||
| 807 | attr ? __event_name(attr->type, attr->config) | ||
| 808 | : "FAIL", | ||
| 809 | event->read.value); | ||
| 810 | 781 | ||
| 811 | return 0; | 782 | return 0; |
| 812 | } | 783 | } |
| @@ -842,11 +813,11 @@ static int sample_type_check(u64 type) | |||
| 842 | 813 | ||
| 843 | static struct perf_file_handler file_handler = { | 814 | static struct perf_file_handler file_handler = { |
| 844 | .process_sample_event = process_sample_event, | 815 | .process_sample_event = process_sample_event, |
| 845 | .process_mmap_event = process_mmap_event, | 816 | .process_mmap_event = event__process_mmap, |
| 846 | .process_comm_event = process_comm_event, | 817 | .process_comm_event = process_comm_event, |
| 847 | .process_exit_event = process_task_event, | 818 | .process_exit_event = event__process_task, |
| 848 | .process_fork_event = process_task_event, | 819 | .process_fork_event = event__process_task, |
| 849 | .process_lost_event = process_lost_event, | 820 | .process_lost_event = event__process_lost, |
| 850 | .process_read_event = process_read_event, | 821 | .process_read_event = process_read_event, |
| 851 | .sample_type_check = sample_type_check, | 822 | .sample_type_check = sample_type_check, |
| 852 | }; | 823 | }; |
| @@ -866,19 +837,14 @@ static int __cmd_report(void) | |||
| 866 | register_perf_file_handler(&file_handler); | 837 | register_perf_file_handler(&file_handler); |
| 867 | 838 | ||
| 868 | ret = mmap_dispatch_perf_file(&header, input_name, force, | 839 | ret = mmap_dispatch_perf_file(&header, input_name, force, |
| 869 | full_paths, &cwdlen, &cwd); | 840 | full_paths, &event__cwdlen, &event__cwd); |
| 870 | if (ret) | 841 | if (ret) |
| 871 | return ret; | 842 | return ret; |
| 872 | 843 | ||
| 873 | dump_printf(" IP events: %10ld\n", total); | 844 | if (dump_trace) { |
| 874 | dump_printf(" mmap events: %10ld\n", total_mmap); | 845 | event__print_totals(); |
| 875 | dump_printf(" comm events: %10ld\n", total_comm); | ||
| 876 | dump_printf(" fork events: %10ld\n", total_fork); | ||
| 877 | dump_printf(" lost events: %10ld\n", total_lost); | ||
| 878 | dump_printf(" unknown events: %10ld\n", file_handler.total_unknown); | ||
| 879 | |||
| 880 | if (dump_trace) | ||
| 881 | return 0; | 846 | return 0; |
| 847 | } | ||
| 882 | 848 | ||
| 883 | if (verbose > 3) | 849 | if (verbose > 3) |
| 884 | threads__fprintf(stdout); | 850 | threads__fprintf(stdout); |
| @@ -887,8 +853,8 @@ static int __cmd_report(void) | |||
| 887 | dsos__fprintf(stdout); | 853 | dsos__fprintf(stdout); |
| 888 | 854 | ||
| 889 | collapse__resort(); | 855 | collapse__resort(); |
| 890 | output__resort(total); | 856 | output__resort(event__stats.total); |
| 891 | output__fprintf(stdout, total); | 857 | output__fprintf(stdout, event__stats.total); |
| 892 | 858 | ||
| 893 | if (show_threads) | 859 | if (show_threads) |
| 894 | perf_read_values_destroy(&show_threads_values); | 860 | perf_read_values_destroy(&show_threads_values); |
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 19eb708a706b..26b782f26ee1 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c | |||
| @@ -22,8 +22,6 @@ | |||
| 22 | 22 | ||
| 23 | static char const *input_name = "perf.data"; | 23 | static char const *input_name = "perf.data"; |
| 24 | 24 | ||
| 25 | static unsigned long total_comm = 0; | ||
| 26 | |||
| 27 | static struct perf_header *header; | 25 | static struct perf_header *header; |
| 28 | static u64 sample_type; | 26 | static u64 sample_type; |
| 29 | 27 | ||
| @@ -32,9 +30,6 @@ static char *sort_order = default_sort_order; | |||
| 32 | 30 | ||
| 33 | static int profile_cpu = -1; | 31 | static int profile_cpu = -1; |
| 34 | 32 | ||
| 35 | static char *cwd; | ||
| 36 | static int cwdlen; | ||
| 37 | |||
| 38 | #define PR_SET_NAME 15 /* Set process name */ | 33 | #define PR_SET_NAME 15 /* Set process name */ |
| 39 | #define MAX_CPUS 4096 | 34 | #define MAX_CPUS 4096 |
| 40 | 35 | ||
| @@ -633,27 +628,6 @@ static void test_calibrations(void) | |||
| 633 | printf("the sleep test took %Ld nsecs\n", T1-T0); | 628 | printf("the sleep test took %Ld nsecs\n", T1-T0); |
| 634 | } | 629 | } |
| 635 | 630 | ||
| 636 | static int | ||
| 637 | process_comm_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 638 | { | ||
| 639 | struct thread *thread = threads__findnew(event->comm.tid); | ||
| 640 | |||
| 641 | dump_printf("%p [%p]: perf_event_comm: %s:%d\n", | ||
| 642 | (void *)(offset + head), | ||
| 643 | (void *)(long)(event->header.size), | ||
| 644 | event->comm.comm, event->comm.pid); | ||
| 645 | |||
| 646 | if (thread == NULL || | ||
| 647 | thread__set_comm(thread, event->comm.comm)) { | ||
| 648 | dump_printf("problem processing perf_event_comm, skipping event.\n"); | ||
| 649 | return -1; | ||
| 650 | } | ||
| 651 | total_comm++; | ||
| 652 | |||
| 653 | return 0; | ||
| 654 | } | ||
| 655 | |||
| 656 | |||
| 657 | struct raw_event_sample { | 631 | struct raw_event_sample { |
| 658 | u32 size; | 632 | u32 size; |
| 659 | char data[0]; | 633 | char data[0]; |
| @@ -1622,8 +1596,7 @@ process_raw_event(event_t *raw_event __used, void *more_data, | |||
| 1622 | process_sched_migrate_task_event(raw, event, cpu, timestamp, thread); | 1596 | process_sched_migrate_task_event(raw, event, cpu, timestamp, thread); |
| 1623 | } | 1597 | } |
| 1624 | 1598 | ||
| 1625 | static int | 1599 | static int process_sample_event(event_t *event) |
| 1626 | process_sample_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 1627 | { | 1600 | { |
| 1628 | struct thread *thread; | 1601 | struct thread *thread; |
| 1629 | u64 ip = event->ip.ip; | 1602 | u64 ip = event->ip.ip; |
| @@ -1653,9 +1626,7 @@ process_sample_event(event_t *event, unsigned long offset, unsigned long head) | |||
| 1653 | more_data += sizeof(u64); | 1626 | more_data += sizeof(u64); |
| 1654 | } | 1627 | } |
| 1655 | 1628 | ||
| 1656 | dump_printf("%p [%p]: PERF_RECORD_SAMPLE (IP, %d): %d/%d: %p period: %Ld\n", | 1629 | dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", |
| 1657 | (void *)(offset + head), | ||
| 1658 | (void *)(long)(event->header.size), | ||
| 1659 | event->header.misc, | 1630 | event->header.misc, |
| 1660 | event->ip.pid, event->ip.tid, | 1631 | event->ip.pid, event->ip.tid, |
| 1661 | (void *)(long)ip, | 1632 | (void *)(long)ip, |
| @@ -1677,10 +1648,7 @@ process_sample_event(event_t *event, unsigned long offset, unsigned long head) | |||
| 1677 | return 0; | 1648 | return 0; |
| 1678 | } | 1649 | } |
| 1679 | 1650 | ||
| 1680 | static int | 1651 | static int process_lost_event(event_t *event __used) |
| 1681 | process_lost_event(event_t *event __used, | ||
| 1682 | unsigned long offset __used, | ||
| 1683 | unsigned long head __used) | ||
| 1684 | { | 1652 | { |
| 1685 | nr_lost_chunks++; | 1653 | nr_lost_chunks++; |
| 1686 | nr_lost_events += event->lost.lost; | 1654 | nr_lost_events += event->lost.lost; |
| @@ -1704,7 +1672,7 @@ static int sample_type_check(u64 type) | |||
| 1704 | 1672 | ||
| 1705 | static struct perf_file_handler file_handler = { | 1673 | static struct perf_file_handler file_handler = { |
| 1706 | .process_sample_event = process_sample_event, | 1674 | .process_sample_event = process_sample_event, |
| 1707 | .process_comm_event = process_comm_event, | 1675 | .process_comm_event = event__process_comm, |
| 1708 | .process_lost_event = process_lost_event, | 1676 | .process_lost_event = process_lost_event, |
| 1709 | .sample_type_check = sample_type_check, | 1677 | .sample_type_check = sample_type_check, |
| 1710 | }; | 1678 | }; |
| @@ -1715,7 +1683,7 @@ static int read_events(void) | |||
| 1715 | register_perf_file_handler(&file_handler); | 1683 | register_perf_file_handler(&file_handler); |
| 1716 | 1684 | ||
| 1717 | return mmap_dispatch_perf_file(&header, input_name, 0, 0, | 1685 | return mmap_dispatch_perf_file(&header, input_name, 0, 0, |
| 1718 | &cwdlen, &cwd); | 1686 | &event__cwdlen, &event__cwd); |
| 1719 | } | 1687 | } |
| 1720 | 1688 | ||
| 1721 | static void print_bad_events(void) | 1689 | static void print_bad_events(void) |
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index bf6730c76033..7a3c0c7aad3d 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
| @@ -991,25 +991,6 @@ static void event__process_sample(const event_t *self, int counter) | |||
| 991 | } | 991 | } |
| 992 | } | 992 | } |
| 993 | 993 | ||
| 994 | static void event__process_mmap(event_t *self) | ||
| 995 | { | ||
| 996 | struct thread *thread = threads__findnew(self->mmap.pid); | ||
| 997 | |||
| 998 | if (thread != NULL) { | ||
| 999 | struct map *map = map__new(&self->mmap, MAP__FUNCTION, NULL, 0); | ||
| 1000 | if (map != NULL) | ||
| 1001 | thread__insert_map(thread, map); | ||
| 1002 | } | ||
| 1003 | } | ||
| 1004 | |||
| 1005 | static void event__process_comm(event_t *self) | ||
| 1006 | { | ||
| 1007 | struct thread *thread = threads__findnew(self->comm.pid); | ||
| 1008 | |||
| 1009 | if (thread != NULL) | ||
| 1010 | thread__set_comm(thread, self->comm.comm); | ||
| 1011 | } | ||
| 1012 | |||
| 1013 | static int event__process(event_t *event) | 994 | static int event__process(event_t *event) |
| 1014 | { | 995 | { |
| 1015 | switch (event->header.type) { | 996 | switch (event->header.type) { |
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 75972fd073df..a7750256c408 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c | |||
| @@ -16,38 +16,10 @@ | |||
| 16 | 16 | ||
| 17 | static char const *input_name = "perf.data"; | 17 | static char const *input_name = "perf.data"; |
| 18 | 18 | ||
| 19 | static unsigned long total = 0; | ||
| 20 | static unsigned long total_comm = 0; | ||
| 21 | |||
| 22 | static struct perf_header *header; | 19 | static struct perf_header *header; |
| 23 | static u64 sample_type; | 20 | static u64 sample_type; |
| 24 | 21 | ||
| 25 | static char *cwd; | 22 | static int process_sample_event(event_t *event) |
| 26 | static int cwdlen; | ||
| 27 | |||
| 28 | |||
| 29 | static int | ||
| 30 | process_comm_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 31 | { | ||
| 32 | struct thread *thread = threads__findnew(event->comm.pid); | ||
| 33 | |||
| 34 | dump_printf("%p [%p]: PERF_RECORD_COMM: %s:%d\n", | ||
| 35 | (void *)(offset + head), | ||
| 36 | (void *)(long)(event->header.size), | ||
| 37 | event->comm.comm, event->comm.pid); | ||
| 38 | |||
| 39 | if (thread == NULL || | ||
| 40 | thread__set_comm(thread, event->comm.comm)) { | ||
| 41 | dump_printf("problem processing PERF_RECORD_COMM, skipping event.\n"); | ||
| 42 | return -1; | ||
| 43 | } | ||
| 44 | total_comm++; | ||
| 45 | |||
| 46 | return 0; | ||
| 47 | } | ||
| 48 | |||
| 49 | static int | ||
| 50 | process_sample_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 51 | { | 23 | { |
| 52 | u64 ip = event->ip.ip; | 24 | u64 ip = event->ip.ip; |
| 53 | u64 timestamp = -1; | 25 | u64 timestamp = -1; |
| @@ -72,9 +44,7 @@ process_sample_event(event_t *event, unsigned long offset, unsigned long head) | |||
| 72 | more_data += sizeof(u64); | 44 | more_data += sizeof(u64); |
| 73 | } | 45 | } |
| 74 | 46 | ||
| 75 | dump_printf("%p [%p]: PERF_RECORD_SAMPLE (IP, %d): %d/%d: %p period: %Ld\n", | 47 | dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", |
| 76 | (void *)(offset + head), | ||
| 77 | (void *)(long)(event->header.size), | ||
| 78 | event->header.misc, | 48 | event->header.misc, |
| 79 | event->ip.pid, event->ip.tid, | 49 | event->ip.pid, event->ip.tid, |
| 80 | (void *)(long)ip, | 50 | (void *)(long)ip, |
| @@ -101,7 +71,7 @@ process_sample_event(event_t *event, unsigned long offset, unsigned long head) | |||
| 101 | */ | 71 | */ |
| 102 | print_event(cpu, raw->data, raw->size, timestamp, thread->comm); | 72 | print_event(cpu, raw->data, raw->size, timestamp, thread->comm); |
| 103 | } | 73 | } |
| 104 | total += period; | 74 | event__stats.total += period; |
| 105 | 75 | ||
| 106 | return 0; | 76 | return 0; |
| 107 | } | 77 | } |
| @@ -122,7 +92,7 @@ static int sample_type_check(u64 type) | |||
| 122 | 92 | ||
| 123 | static struct perf_file_handler file_handler = { | 93 | static struct perf_file_handler file_handler = { |
| 124 | .process_sample_event = process_sample_event, | 94 | .process_sample_event = process_sample_event, |
| 125 | .process_comm_event = process_comm_event, | 95 | .process_comm_event = event__process_comm, |
| 126 | .sample_type_check = sample_type_check, | 96 | .sample_type_check = sample_type_check, |
| 127 | }; | 97 | }; |
| 128 | 98 | ||
| @@ -132,7 +102,7 @@ static int __cmd_trace(void) | |||
| 132 | register_perf_file_handler(&file_handler); | 102 | register_perf_file_handler(&file_handler); |
| 133 | 103 | ||
| 134 | return mmap_dispatch_perf_file(&header, input_name, | 104 | return mmap_dispatch_perf_file(&header, input_name, |
| 135 | 0, 0, &cwdlen, &cwd); | 105 | 0, 0, &event__cwdlen, &event__cwd); |
| 136 | } | 106 | } |
| 137 | 107 | ||
| 138 | static const char * const annotate_usage[] = { | 108 | static const char * const annotate_usage[] = { |
diff --git a/tools/perf/util/data_map.c b/tools/perf/util/data_map.c index b238462b8983..ca0bedf637c2 100644 --- a/tools/perf/util/data_map.c +++ b/tools/perf/util/data_map.c | |||
| @@ -8,11 +8,9 @@ static struct perf_file_handler *curr_handler; | |||
| 8 | static unsigned long mmap_window = 32; | 8 | static unsigned long mmap_window = 32; |
| 9 | static char __cwd[PATH_MAX]; | 9 | static char __cwd[PATH_MAX]; |
| 10 | 10 | ||
| 11 | static int | 11 | static int process_event_stub(event_t *event __used) |
| 12 | process_event_stub(event_t *event __used, | ||
| 13 | unsigned long offset __used, | ||
| 14 | unsigned long head __used) | ||
| 15 | { | 12 | { |
| 13 | dump_printf(": unhandled!\n"); | ||
| 16 | return 0; | 14 | return 0; |
| 17 | } | 15 | } |
| 18 | 16 | ||
| @@ -40,30 +38,62 @@ void register_perf_file_handler(struct perf_file_handler *handler) | |||
| 40 | curr_handler = handler; | 38 | curr_handler = handler; |
| 41 | } | 39 | } |
| 42 | 40 | ||
| 41 | static const char *event__name[] = { | ||
| 42 | [0] = "TOTAL", | ||
| 43 | [PERF_RECORD_MMAP] = "MMAP", | ||
| 44 | [PERF_RECORD_LOST] = "LOST", | ||
| 45 | [PERF_RECORD_COMM] = "COMM", | ||
| 46 | [PERF_RECORD_EXIT] = "EXIT", | ||
| 47 | [PERF_RECORD_THROTTLE] = "THROTTLE", | ||
| 48 | [PERF_RECORD_UNTHROTTLE] = "UNTHROTTLE", | ||
| 49 | [PERF_RECORD_FORK] = "FORK", | ||
| 50 | [PERF_RECORD_READ] = "READ", | ||
| 51 | [PERF_RECORD_SAMPLE] = "SAMPLE", | ||
| 52 | }; | ||
| 53 | |||
| 54 | unsigned long event__total[PERF_RECORD_MAX]; | ||
| 55 | |||
| 56 | void event__print_totals(void) | ||
| 57 | { | ||
| 58 | int i; | ||
| 59 | for (i = 0; i < PERF_RECORD_MAX; ++i) | ||
| 60 | pr_info("%10s events: %10ld\n", | ||
| 61 | event__name[i], event__total[i]); | ||
| 62 | } | ||
| 63 | |||
| 43 | static int | 64 | static int |
| 44 | process_event(event_t *event, unsigned long offset, unsigned long head) | 65 | process_event(event_t *event, unsigned long offset, unsigned long head) |
| 45 | { | 66 | { |
| 46 | trace_event(event); | 67 | trace_event(event); |
| 47 | 68 | ||
| 69 | if (event->header.type < PERF_RECORD_MAX) { | ||
| 70 | dump_printf("%p [%p]: PERF_RECORD_%s", | ||
| 71 | (void *)(offset + head), | ||
| 72 | (void *)(long)(event->header.size), | ||
| 73 | event__name[event->header.type]); | ||
| 74 | ++event__total[0]; | ||
| 75 | ++event__total[event->header.type]; | ||
| 76 | } | ||
| 77 | |||
| 48 | switch (event->header.type) { | 78 | switch (event->header.type) { |
| 49 | case PERF_RECORD_SAMPLE: | 79 | case PERF_RECORD_SAMPLE: |
| 50 | return curr_handler->process_sample_event(event, offset, head); | 80 | return curr_handler->process_sample_event(event); |
| 51 | case PERF_RECORD_MMAP: | 81 | case PERF_RECORD_MMAP: |
| 52 | return curr_handler->process_mmap_event(event, offset, head); | 82 | return curr_handler->process_mmap_event(event); |
| 53 | case PERF_RECORD_COMM: | 83 | case PERF_RECORD_COMM: |
| 54 | return curr_handler->process_comm_event(event, offset, head); | 84 | return curr_handler->process_comm_event(event); |
| 55 | case PERF_RECORD_FORK: | 85 | case PERF_RECORD_FORK: |
| 56 | return curr_handler->process_fork_event(event, offset, head); | 86 | return curr_handler->process_fork_event(event); |
| 57 | case PERF_RECORD_EXIT: | 87 | case PERF_RECORD_EXIT: |
| 58 | return curr_handler->process_exit_event(event, offset, head); | 88 | return curr_handler->process_exit_event(event); |
| 59 | case PERF_RECORD_LOST: | 89 | case PERF_RECORD_LOST: |
| 60 | return curr_handler->process_lost_event(event, offset, head); | 90 | return curr_handler->process_lost_event(event); |
| 61 | case PERF_RECORD_READ: | 91 | case PERF_RECORD_READ: |
| 62 | return curr_handler->process_read_event(event, offset, head); | 92 | return curr_handler->process_read_event(event); |
| 63 | case PERF_RECORD_THROTTLE: | 93 | case PERF_RECORD_THROTTLE: |
| 64 | return curr_handler->process_throttle_event(event, offset, head); | 94 | return curr_handler->process_throttle_event(event); |
| 65 | case PERF_RECORD_UNTHROTTLE: | 95 | case PERF_RECORD_UNTHROTTLE: |
| 66 | return curr_handler->process_unthrottle_event(event, offset, head); | 96 | return curr_handler->process_unthrottle_event(event); |
| 67 | default: | 97 | default: |
| 68 | curr_handler->total_unknown++; | 98 | curr_handler->total_unknown++; |
| 69 | return -1; | 99 | return -1; |
diff --git a/tools/perf/util/data_map.h b/tools/perf/util/data_map.h index ae036ecd7625..3180ff7e3633 100644 --- a/tools/perf/util/data_map.h +++ b/tools/perf/util/data_map.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | #include "event.h" | 4 | #include "event.h" |
| 5 | #include "header.h" | 5 | #include "header.h" |
| 6 | 6 | ||
| 7 | typedef int (*event_type_handler_t)(event_t *, unsigned long, unsigned long); | 7 | typedef int (*event_type_handler_t)(event_t *); |
| 8 | 8 | ||
| 9 | struct perf_file_handler { | 9 | struct perf_file_handler { |
| 10 | event_type_handler_t process_sample_event; | 10 | event_type_handler_t process_sample_event; |
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 1dae7e3b400d..70b4aa03b472 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #include "event.h" | 2 | #include "event.h" |
| 3 | #include "debug.h" | 3 | #include "debug.h" |
| 4 | #include "string.h" | 4 | #include "string.h" |
| 5 | #include "thread.h" | ||
| 5 | 6 | ||
| 6 | static pid_t event__synthesize_comm(pid_t pid, int full, | 7 | static pid_t event__synthesize_comm(pid_t pid, int full, |
| 7 | int (*process)(event_t *event)) | 8 | int (*process)(event_t *event)) |
| @@ -175,3 +176,76 @@ void event__synthesize_threads(int (*process)(event_t *event)) | |||
| 175 | 176 | ||
| 176 | closedir(proc); | 177 | closedir(proc); |
| 177 | } | 178 | } |
| 179 | |||
| 180 | char *event__cwd; | ||
| 181 | int event__cwdlen; | ||
| 182 | |||
| 183 | struct events_stats event__stats; | ||
| 184 | |||
| 185 | int event__process_comm(event_t *self) | ||
| 186 | { | ||
| 187 | struct thread *thread = threads__findnew(self->comm.pid); | ||
| 188 | |||
| 189 | dump_printf("PERF_RECORD_COMM: %s:%d\n", | ||
| 190 | self->comm.comm, self->comm.pid); | ||
| 191 | |||
| 192 | if (thread == NULL || thread__set_comm(thread, self->comm.comm)) { | ||
| 193 | dump_printf("problem processing PERF_RECORD_COMM, skipping event.\n"); | ||
| 194 | return -1; | ||
| 195 | } | ||
| 196 | |||
| 197 | return 0; | ||
| 198 | } | ||
| 199 | |||
| 200 | int event__process_lost(event_t *self) | ||
| 201 | { | ||
| 202 | dump_printf(": id:%Ld: lost:%Ld\n", self->lost.id, self->lost.lost); | ||
| 203 | event__stats.lost += self->lost.lost; | ||
| 204 | return 0; | ||
| 205 | } | ||
| 206 | |||
| 207 | int event__process_mmap(event_t *self) | ||
| 208 | { | ||
| 209 | struct thread *thread = threads__findnew(self->mmap.pid); | ||
| 210 | struct map *map = map__new(&self->mmap, MAP__FUNCTION, | ||
| 211 | event__cwd, event__cwdlen); | ||
| 212 | |||
| 213 | dump_printf(" %d/%d: [%p(%p) @ %p]: %s\n", | ||
| 214 | self->mmap.pid, self->mmap.tid, | ||
| 215 | (void *)(long)self->mmap.start, | ||
| 216 | (void *)(long)self->mmap.len, | ||
| 217 | (void *)(long)self->mmap.pgoff, | ||
| 218 | self->mmap.filename); | ||
| 219 | |||
| 220 | if (thread == NULL || map == NULL) | ||
| 221 | dump_printf("problem processing PERF_RECORD_MMAP, skipping event.\n"); | ||
| 222 | else | ||
| 223 | thread__insert_map(thread, map); | ||
| 224 | |||
| 225 | return 0; | ||
| 226 | } | ||
| 227 | |||
| 228 | int event__process_task(event_t *self) | ||
| 229 | { | ||
| 230 | struct thread *thread = threads__findnew(self->fork.pid); | ||
| 231 | struct thread *parent = threads__findnew(self->fork.ppid); | ||
| 232 | |||
| 233 | dump_printf("(%d:%d):(%d:%d)\n", self->fork.pid, self->fork.tid, | ||
| 234 | self->fork.ppid, self->fork.ptid); | ||
| 235 | /* | ||
| 236 | * A thread clone will have the same PID for both parent and child. | ||
| 237 | */ | ||
| 238 | if (thread == parent) | ||
| 239 | return 0; | ||
| 240 | |||
| 241 | if (self->header.type == PERF_RECORD_EXIT) | ||
| 242 | return 0; | ||
| 243 | |||
| 244 | if (thread == NULL || parent == NULL || | ||
| 245 | thread__fork(thread, parent) < 0) { | ||
| 246 | dump_printf("problem processing PERF_RECORD_FORK, skipping event.\n"); | ||
| 247 | return -1; | ||
| 248 | } | ||
| 249 | |||
| 250 | return 0; | ||
| 251 | } | ||
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index 3ae3c964c901..13c12c75f970 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h | |||
| @@ -80,6 +80,13 @@ typedef union event_union { | |||
| 80 | struct sample_event sample; | 80 | struct sample_event sample; |
| 81 | } event_t; | 81 | } event_t; |
| 82 | 82 | ||
| 83 | struct events_stats { | ||
| 84 | unsigned long total; | ||
| 85 | unsigned long lost; | ||
| 86 | }; | ||
| 87 | |||
| 88 | void event__print_totals(void); | ||
| 89 | |||
| 83 | enum map_type { | 90 | enum map_type { |
| 84 | MAP__FUNCTION = 0, | 91 | MAP__FUNCTION = 0, |
| 85 | 92 | ||
| @@ -135,4 +142,14 @@ void map__fixup_end(struct map *self); | |||
| 135 | int event__synthesize_thread(pid_t pid, int (*process)(event_t *event)); | 142 | int event__synthesize_thread(pid_t pid, int (*process)(event_t *event)); |
| 136 | void event__synthesize_threads(int (*process)(event_t *event)); | 143 | void event__synthesize_threads(int (*process)(event_t *event)); |
| 137 | 144 | ||
| 145 | extern char *event__cwd; | ||
| 146 | extern int event__cwdlen; | ||
| 147 | extern struct events_stats event__stats; | ||
| 148 | extern unsigned long event__total[PERF_RECORD_MAX]; | ||
| 149 | |||
| 150 | int event__process_comm(event_t *self); | ||
| 151 | int event__process_lost(event_t *self); | ||
| 152 | int event__process_mmap(event_t *self); | ||
| 153 | int event__process_task(event_t *self); | ||
| 154 | |||
| 138 | #endif /* __PERF_RECORD_H */ | 155 | #endif /* __PERF_RECORD_H */ |
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index 7393a02fd8d4..f26cd9ba00fd 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c | |||
| @@ -10,13 +10,6 @@ struct callchain_param callchain_param = { | |||
| 10 | .min_percent = 0.5 | 10 | .min_percent = 0.5 |
| 11 | }; | 11 | }; |
| 12 | 12 | ||
| 13 | unsigned long total; | ||
| 14 | unsigned long total_mmap; | ||
| 15 | unsigned long total_comm; | ||
| 16 | unsigned long total_fork; | ||
| 17 | unsigned long total_unknown; | ||
| 18 | unsigned long total_lost; | ||
| 19 | |||
| 20 | /* | 13 | /* |
| 21 | * histogram, sorted on item, collects counts | 14 | * histogram, sorted on item, collects counts |
| 22 | */ | 15 | */ |
diff --git a/tools/perf/util/process_event.c b/tools/perf/util/process_event.c deleted file mode 100644 index a970789581a2..000000000000 --- a/tools/perf/util/process_event.c +++ /dev/null | |||
| @@ -1,53 +0,0 @@ | |||
| 1 | #include "process_event.h" | ||
| 2 | |||
| 3 | char *cwd; | ||
| 4 | int cwdlen; | ||
| 5 | |||
| 6 | int | ||
| 7 | process_mmap_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 8 | { | ||
| 9 | struct map *map = map__new(&event->mmap, cwd, cwdlen); | ||
| 10 | struct thread *thread = threads__findnew(event->mmap.pid); | ||
| 11 | |||
| 12 | dump_printf("%p [%p]: PERF_RECORD_MMAP %d/%d: [%p(%p) @ %p]: %s\n", | ||
| 13 | (void *)(offset + head), | ||
| 14 | (void *)(long)(event->header.size), | ||
| 15 | event->mmap.pid, | ||
| 16 | event->mmap.tid, | ||
| 17 | (void *)(long)event->mmap.start, | ||
| 18 | (void *)(long)event->mmap.len, | ||
| 19 | (void *)(long)event->mmap.pgoff, | ||
| 20 | event->mmap.filename); | ||
| 21 | |||
| 22 | if (thread == NULL || map == NULL) { | ||
| 23 | dump_printf("problem processing PERF_RECORD_MMAP, skipping event.\n"); | ||
| 24 | return 0; | ||
| 25 | } | ||
| 26 | |||
| 27 | thread__insert_map(thread, map); | ||
| 28 | total_mmap++; | ||
| 29 | |||
| 30 | return 0; | ||
| 31 | |||
| 32 | } | ||
| 33 | |||
| 34 | int | ||
| 35 | process_comm_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 36 | { | ||
| 37 | struct thread *thread = threads__findnew(event->comm.pid); | ||
| 38 | |||
| 39 | dump_printf("%p [%p]: PERF_RECORD_COMM: %s:%d\n", | ||
| 40 | (void *)(offset + head), | ||
| 41 | (void *)(long)(event->header.size), | ||
| 42 | event->comm.comm, event->comm.pid); | ||
| 43 | |||
| 44 | if (thread == NULL || | ||
| 45 | thread__set_comm_adjust(thread, event->comm.comm)) { | ||
| 46 | dump_printf("problem processing PERF_RECORD_COMM, skipping event.\n"); | ||
| 47 | return -1; | ||
| 48 | } | ||
| 49 | total_comm++; | ||
| 50 | |||
| 51 | return 0; | ||
| 52 | } | ||
| 53 | |||
diff --git a/tools/perf/util/process_event.h b/tools/perf/util/process_event.h deleted file mode 100644 index 6f68c69736cd..000000000000 --- a/tools/perf/util/process_event.h +++ /dev/null | |||
| @@ -1,29 +0,0 @@ | |||
| 1 | #ifndef __PROCESS_EVENT_H | ||
| 2 | #define __PROCESS_EVENT_H | ||
| 3 | |||
| 4 | #include "../builtin.h" | ||
| 5 | #include "util.h" | ||
| 6 | |||
| 7 | #include "color.h" | ||
| 8 | #include <linux/list.h> | ||
| 9 | #include "cache.h" | ||
| 10 | #include <linux/rbtree.h> | ||
| 11 | #include "symbol.h" | ||
| 12 | #include "string.h" | ||
| 13 | |||
| 14 | #include "../perf.h" | ||
| 15 | #include "debug.h" | ||
| 16 | |||
| 17 | #include "parse-options.h" | ||
| 18 | #include "parse-events.h" | ||
| 19 | |||
| 20 | #include "thread.h" | ||
| 21 | #include "sort.h" | ||
| 22 | #include "hist.h" | ||
| 23 | |||
| 24 | extern char *cwd; | ||
| 25 | extern int cwdlen; | ||
| 26 | extern int process_mmap_event(event_t *, unsigned long, unsigned long); | ||
| 27 | extern int process_comm_event(event_t *, unsigned long , unsigned long); | ||
| 28 | |||
| 29 | #endif /* __PROCESS_H */ | ||
diff --git a/tools/perf/util/process_events.c b/tools/perf/util/process_events.c deleted file mode 100644 index 53778684641c..000000000000 --- a/tools/perf/util/process_events.c +++ /dev/null | |||
| @@ -1,64 +0,0 @@ | |||
| 1 | #include "process_events.h" | ||
| 2 | |||
| 3 | char *cwd; | ||
| 4 | int cwdlen; | ||
| 5 | |||
| 6 | int | ||
| 7 | process_mmap_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 8 | { | ||
| 9 | struct map *map = map__new(&event->mmap, MAP__FUNCTION, cwd, cwdlen); | ||
| 10 | struct thread *thread = threads__findnew(event->mmap.pid); | ||
| 11 | |||
| 12 | dump_printf("%p [%p]: PERF_RECORD_MMAP %d/%d: [%p(%p) @ %p]: %s\n", | ||
| 13 | (void *)(offset + head), | ||
| 14 | (void *)(long)(event->header.size), | ||
| 15 | event->mmap.pid, | ||
| 16 | event->mmap.tid, | ||
| 17 | (void *)(long)event->mmap.start, | ||
| 18 | (void *)(long)event->mmap.len, | ||
| 19 | (void *)(long)event->mmap.pgoff, | ||
| 20 | event->mmap.filename); | ||
| 21 | |||
| 22 | if (thread == NULL || map == NULL) { | ||
| 23 | dump_printf("problem processing PERF_RECORD_MMAP, skipping event.\n"); | ||
| 24 | return 0; | ||
| 25 | } | ||
| 26 | |||
| 27 | thread__insert_map(thread, map); | ||
| 28 | total_mmap++; | ||
| 29 | |||
| 30 | return 0; | ||
| 31 | } | ||
| 32 | |||
| 33 | int | ||
| 34 | process_task_event(event_t *event, unsigned long offset, unsigned long head) | ||
| 35 | { | ||
| 36 | struct thread *thread = threads__findnew(event->fork.pid); | ||
| 37 | struct thread *parent = threads__findnew(event->fork.ppid); | ||
| 38 | |||
| 39 | dump_printf("%p [%p]: PERF_RECORD_%s: (%d:%d):(%d:%d)\n", | ||
| 40 | (void *)(offset + head), | ||
| 41 | (void *)(long)(event->header.size), | ||
| 42 | event->header.type == PERF_RECORD_FORK ? "FORK" : "EXIT", | ||
| 43 | event->fork.pid, event->fork.tid, | ||
| 44 | event->fork.ppid, event->fork.ptid); | ||
| 45 | |||
| 46 | /* | ||
| 47 | * A thread clone will have the same PID for both | ||
| 48 | * parent and child. | ||
| 49 | */ | ||
| 50 | if (thread == parent) | ||
| 51 | return 0; | ||
| 52 | |||
| 53 | if (event->header.type == PERF_RECORD_EXIT) | ||
| 54 | return 0; | ||
| 55 | |||
| 56 | if (!thread || !parent || thread__fork(thread, parent)) { | ||
| 57 | dump_printf("problem processing PERF_RECORD_FORK, skipping event.\n"); | ||
| 58 | return -1; | ||
| 59 | } | ||
| 60 | total_fork++; | ||
| 61 | |||
| 62 | return 0; | ||
| 63 | } | ||
| 64 | |||
diff --git a/tools/perf/util/process_events.h b/tools/perf/util/process_events.h deleted file mode 100644 index 73d092f83283..000000000000 --- a/tools/perf/util/process_events.h +++ /dev/null | |||
| @@ -1,35 +0,0 @@ | |||
| 1 | #ifndef __PROCESS_EVENTS_H | ||
| 2 | #define __PROCESS_EVENTS_H | ||
| 3 | |||
| 4 | #include "../builtin.h" | ||
| 5 | |||
| 6 | #include "util.h" | ||
| 7 | #include "color.h" | ||
| 8 | #include <linux/list.h> | ||
| 9 | #include "cache.h" | ||
| 10 | #include <linux/rbtree.h> | ||
| 11 | #include "symbol.h" | ||
| 12 | #include "string.h" | ||
| 13 | #include "callchain.h" | ||
| 14 | #include "strlist.h" | ||
| 15 | #include "values.h" | ||
| 16 | |||
| 17 | #include "../perf.h" | ||
| 18 | #include "debug.h" | ||
| 19 | #include "header.h" | ||
| 20 | |||
| 21 | #include "parse-options.h" | ||
| 22 | #include "parse-events.h" | ||
| 23 | |||
| 24 | #include "data_map.h" | ||
| 25 | #include "thread.h" | ||
| 26 | #include "sort.h" | ||
| 27 | #include "hist.h" | ||
| 28 | |||
| 29 | extern char *cwd; | ||
| 30 | extern int cwdlen; | ||
| 31 | |||
| 32 | extern int process_mmap_event(event_t *, unsigned long , unsigned long); | ||
| 33 | extern int process_task_event(event_t *, unsigned long, unsigned long); | ||
| 34 | |||
| 35 | #endif /* __PROCESS_EVENTS_H */ | ||
