diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2009-11-27 13:29:22 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-11-27 14:22:01 -0500 |
commit | 62daacb51a2bf8480e6f6b3696b03f102fc15eb0 (patch) | |
tree | 5b9ed87005a5e59bcc95dd9a42e3d09d6481362d /tools/perf/builtin-annotate.c | |
parent | 1de8e24520ffdcf2a90c842eed937f59079a2abd (diff) |
perf tools: Reorganize event processing routines, lotsa dups killed
While implementing event__preprocess_sample, that will do all of
the symbol lookup in one convenient function, I noticed that
util/process_event.[ch] were not being used at all, then started
looking if there were other functions that could be shared
and...
All those functions really don't need to receive offset + head,
the only thing they did was common to all of them, so do it at
one place instead.
Stats about number of each type of event processed now is done
in a central place.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: John Kacur <jkacur@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1259346563-12568-11-git-send-email-acme@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
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 | ||