diff options
Diffstat (limited to 'tools/perf/builtin-annotate.c')
| -rw-r--r-- | tools/perf/builtin-annotate.c | 63 |
1 files changed, 15 insertions, 48 deletions
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 | ||
