diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2009-12-14 10:10:39 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-12-14 10:57:18 -0500 |
commit | 4e4f06e4c8f17ea96f7dd76251cab99511026401 (patch) | |
tree | 18b7f83b664939be0a9bde8e43daf9db8ca7fccc | |
parent | b9bf089212d95746ce66482bcdbc7e77a0651088 (diff) |
perf session: Move the hist_entries rb tree to perf_session
As we'll need to sort multiple times for multiple perf sessions,
so that we can then do a diff.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1260803439-16783-1-git-send-email-acme@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | tools/perf/builtin-annotate.c | 19 | ||||
-rw-r--r-- | tools/perf/builtin-kmem.c | 2 | ||||
-rw-r--r-- | tools/perf/builtin-report.c | 55 | ||||
-rw-r--r-- | tools/perf/builtin-sched.c | 2 | ||||
-rw-r--r-- | tools/perf/builtin-timechart.c | 2 | ||||
-rw-r--r-- | tools/perf/builtin-trace.c | 2 | ||||
-rw-r--r-- | tools/perf/util/data_map.c | 2 | ||||
-rw-r--r-- | tools/perf/util/hist.c | 43 | ||||
-rw-r--r-- | tools/perf/util/hist.h | 43 | ||||
-rw-r--r-- | tools/perf/util/session.h | 5 |
10 files changed, 86 insertions, 89 deletions
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index f25e89e9c9b0..1f1341f1dd84 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c | |||
@@ -121,10 +121,12 @@ static void hist_hit(struct hist_entry *he, u64 ip) | |||
121 | h->ip[offset]); | 121 | h->ip[offset]); |
122 | } | 122 | } |
123 | 123 | ||
124 | static int hist_entry__add(struct addr_location *al, u64 count) | 124 | static int perf_session__add_hist_entry(struct perf_session *self, |
125 | struct addr_location *al, u64 count) | ||
125 | { | 126 | { |
126 | bool hit; | 127 | bool hit; |
127 | struct hist_entry *he = __hist_entry__add(al, NULL, count, &hit); | 128 | struct hist_entry *he = __perf_session__add_hist_entry(self, al, NULL, |
129 | count, &hit); | ||
128 | if (he == NULL) | 130 | if (he == NULL) |
129 | return -ENOMEM; | 131 | return -ENOMEM; |
130 | hist_hit(he, al->addr); | 132 | hist_hit(he, al->addr); |
@@ -144,7 +146,7 @@ static int process_sample_event(event_t *event, struct perf_session *session) | |||
144 | return -1; | 146 | return -1; |
145 | } | 147 | } |
146 | 148 | ||
147 | if (hist_entry__add(&al, 1)) { | 149 | if (perf_session__add_hist_entry(session, &al, 1)) { |
148 | fprintf(stderr, "problem incrementing symbol count, " | 150 | fprintf(stderr, "problem incrementing symbol count, " |
149 | "skipping event\n"); | 151 | "skipping event\n"); |
150 | return -1; | 152 | return -1; |
@@ -428,11 +430,11 @@ static void annotate_sym(struct hist_entry *he) | |||
428 | free_source_line(he, len); | 430 | free_source_line(he, len); |
429 | } | 431 | } |
430 | 432 | ||
431 | static void find_annotations(void) | 433 | static void perf_session__find_annotations(struct perf_session *self) |
432 | { | 434 | { |
433 | struct rb_node *nd; | 435 | struct rb_node *nd; |
434 | 436 | ||
435 | for (nd = rb_first(&hist); nd; nd = rb_next(nd)) { | 437 | for (nd = rb_first(&self->hists); nd; nd = rb_next(nd)) { |
436 | struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node); | 438 | struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node); |
437 | struct sym_priv *priv; | 439 | struct sym_priv *priv; |
438 | 440 | ||
@@ -484,10 +486,9 @@ static int __cmd_annotate(void) | |||
484 | if (verbose > 2) | 486 | if (verbose > 2) |
485 | dsos__fprintf(stdout); | 487 | dsos__fprintf(stdout); |
486 | 488 | ||
487 | collapse__resort(); | 489 | perf_session__collapse_resort(session); |
488 | output__resort(event__total[0]); | 490 | perf_session__output_resort(session, event__total[0]); |
489 | 491 | perf_session__find_annotations(session); | |
490 | find_annotations(); | ||
491 | out_delete: | 492 | out_delete: |
492 | perf_session__delete(session); | 493 | perf_session__delete(session); |
493 | 494 | ||
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index e79ecbc17181..3b329c66b505 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c | |||
@@ -344,7 +344,7 @@ static int process_sample_event(event_t *event, struct perf_session *session) | |||
344 | return 0; | 344 | return 0; |
345 | } | 345 | } |
346 | 346 | ||
347 | static int sample_type_check(u64 type) | 347 | static int sample_type_check(u64 type, struct perf_session *session __used) |
348 | { | 348 | { |
349 | sample_type = type; | 349 | sample_type = type; |
350 | 350 | ||
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 9cbdcbc4cd56..854427f0e57e 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
@@ -38,6 +38,7 @@ static char *dso_list_str, *comm_list_str, *sym_list_str, | |||
38 | static struct strlist *dso_list, *comm_list, *sym_list; | 38 | static struct strlist *dso_list, *comm_list, *sym_list; |
39 | 39 | ||
40 | static int force; | 40 | static int force; |
41 | static bool use_callchain; | ||
41 | 42 | ||
42 | static int show_nr_samples; | 43 | static int show_nr_samples; |
43 | 44 | ||
@@ -312,8 +313,9 @@ hist_entry_callchain__fprintf(FILE *fp, struct hist_entry *self, | |||
312 | return ret; | 313 | return ret; |
313 | } | 314 | } |
314 | 315 | ||
315 | static size_t | 316 | static size_t hist_entry__fprintf(FILE *fp, struct hist_entry *self, |
316 | hist_entry__fprintf(FILE *fp, struct hist_entry *self, u64 total_samples) | 317 | struct perf_session *session, |
318 | u64 total_samples) | ||
317 | { | 319 | { |
318 | struct sort_entry *se; | 320 | struct sort_entry *se; |
319 | size_t ret; | 321 | size_t ret; |
@@ -345,7 +347,7 @@ hist_entry__fprintf(FILE *fp, struct hist_entry *self, u64 total_samples) | |||
345 | 347 | ||
346 | ret += fprintf(fp, "\n"); | 348 | ret += fprintf(fp, "\n"); |
347 | 349 | ||
348 | if (callchain) { | 350 | if (session->use_callchain) { |
349 | int left_margin = 0; | 351 | int left_margin = 0; |
350 | 352 | ||
351 | if (sort__first_dimension == SORT_COMM) { | 353 | if (sort__first_dimension == SORT_COMM) { |
@@ -422,7 +424,7 @@ static struct symbol **resolve_callchain(struct thread *thread, | |||
422 | struct symbol **syms = NULL; | 424 | struct symbol **syms = NULL; |
423 | unsigned int i; | 425 | unsigned int i; |
424 | 426 | ||
425 | if (callchain) { | 427 | if (session->use_callchain) { |
426 | syms = calloc(chain->nr, sizeof(*syms)); | 428 | syms = calloc(chain->nr, sizeof(*syms)); |
427 | if (!syms) { | 429 | if (!syms) { |
428 | fprintf(stderr, "Can't allocate memory for symbols\n"); | 430 | fprintf(stderr, "Can't allocate memory for symbols\n"); |
@@ -454,7 +456,7 @@ static struct symbol **resolve_callchain(struct thread *thread, | |||
454 | if (sort__has_parent && !*parent && | 456 | if (sort__has_parent && !*parent && |
455 | call__match(al.sym)) | 457 | call__match(al.sym)) |
456 | *parent = al.sym; | 458 | *parent = al.sym; |
457 | if (!callchain) | 459 | if (!session->use_callchain) |
458 | break; | 460 | break; |
459 | syms[i] = al.sym; | 461 | syms[i] = al.sym; |
460 | } | 462 | } |
@@ -467,25 +469,25 @@ static struct symbol **resolve_callchain(struct thread *thread, | |||
467 | * collect histogram counts | 469 | * collect histogram counts |
468 | */ | 470 | */ |
469 | 471 | ||
470 | static int hist_entry__add(struct addr_location *al, | 472 | static int perf_session__add_hist_entry(struct perf_session *self, |
471 | struct perf_session *session, | 473 | struct addr_location *al, |
472 | struct ip_callchain *chain, u64 count) | 474 | struct ip_callchain *chain, u64 count) |
473 | { | 475 | { |
474 | struct symbol **syms = NULL, *parent = NULL; | 476 | struct symbol **syms = NULL, *parent = NULL; |
475 | bool hit; | 477 | bool hit; |
476 | struct hist_entry *he; | 478 | struct hist_entry *he; |
477 | 479 | ||
478 | if ((sort__has_parent || callchain) && chain) | 480 | if ((sort__has_parent || self->use_callchain) && chain) |
479 | syms = resolve_callchain(al->thread, session, chain, &parent); | 481 | syms = resolve_callchain(al->thread, self, chain, &parent); |
480 | 482 | ||
481 | he = __hist_entry__add(al, parent, count, &hit); | 483 | he = __perf_session__add_hist_entry(self, al, parent, count, &hit); |
482 | if (he == NULL) | 484 | if (he == NULL) |
483 | return -ENOMEM; | 485 | return -ENOMEM; |
484 | 486 | ||
485 | if (hit) | 487 | if (hit) |
486 | he->count += count; | 488 | he->count += count; |
487 | 489 | ||
488 | if (callchain) { | 490 | if (self->use_callchain) { |
489 | if (!hit) | 491 | if (!hit) |
490 | callchain_init(&he->callchain); | 492 | callchain_init(&he->callchain); |
491 | append_chain(&he->callchain, chain, syms); | 493 | append_chain(&he->callchain, chain, syms); |
@@ -495,7 +497,8 @@ static int hist_entry__add(struct addr_location *al, | |||
495 | return 0; | 497 | return 0; |
496 | } | 498 | } |
497 | 499 | ||
498 | static size_t output__fprintf(FILE *fp, u64 total_samples) | 500 | static size_t perf_session__fprintf_hist_entries(struct perf_session *self, |
501 | u64 total_samples, FILE *fp) | ||
499 | { | 502 | { |
500 | struct hist_entry *pos; | 503 | struct hist_entry *pos; |
501 | struct sort_entry *se; | 504 | struct sort_entry *se; |
@@ -567,9 +570,9 @@ static size_t output__fprintf(FILE *fp, u64 total_samples) | |||
567 | fprintf(fp, "#\n"); | 570 | fprintf(fp, "#\n"); |
568 | 571 | ||
569 | print_entries: | 572 | print_entries: |
570 | for (nd = rb_first(&hist); nd; nd = rb_next(nd)) { | 573 | for (nd = rb_first(&self->hists); nd; nd = rb_next(nd)) { |
571 | pos = rb_entry(nd, struct hist_entry, rb_node); | 574 | pos = rb_entry(nd, struct hist_entry, rb_node); |
572 | ret += hist_entry__fprintf(fp, pos, total_samples); | 575 | ret += hist_entry__fprintf(fp, pos, self, total_samples); |
573 | } | 576 | } |
574 | 577 | ||
575 | if (sort_order == default_sort_order && | 578 | if (sort_order == default_sort_order && |
@@ -671,7 +674,7 @@ static int process_sample_event(event_t *event, struct perf_session *session) | |||
671 | if (sym_list && al.sym && !strlist__has_entry(sym_list, al.sym->name)) | 674 | if (sym_list && al.sym && !strlist__has_entry(sym_list, al.sym->name)) |
672 | return 0; | 675 | return 0; |
673 | 676 | ||
674 | if (hist_entry__add(&al, session, data.callchain, data.period)) { | 677 | if (perf_session__add_hist_entry(session, &al, data.callchain, data.period)) { |
675 | pr_debug("problem incrementing symbol count, skipping event\n"); | 678 | pr_debug("problem incrementing symbol count, skipping event\n"); |
676 | return -1; | 679 | return -1; |
677 | } | 680 | } |
@@ -719,7 +722,7 @@ static int process_read_event(event_t *event, struct perf_session *session __use | |||
719 | return 0; | 722 | return 0; |
720 | } | 723 | } |
721 | 724 | ||
722 | static int sample_type_check(u64 type) | 725 | static int sample_type_check(u64 type, struct perf_session *session) |
723 | { | 726 | { |
724 | sample_type = type; | 727 | sample_type = type; |
725 | 728 | ||
@@ -730,14 +733,14 @@ static int sample_type_check(u64 type) | |||
730 | " perf record without -g?\n"); | 733 | " perf record without -g?\n"); |
731 | return -1; | 734 | return -1; |
732 | } | 735 | } |
733 | if (callchain) { | 736 | if (session->use_callchain) { |
734 | fprintf(stderr, "selected -g but no callchain data." | 737 | fprintf(stderr, "selected -g but no callchain data." |
735 | " Did you call perf record without" | 738 | " Did you call perf record without" |
736 | " -g?\n"); | 739 | " -g?\n"); |
737 | return -1; | 740 | return -1; |
738 | } | 741 | } |
739 | } else if (callchain_param.mode != CHAIN_NONE && !callchain) { | 742 | } else if (callchain_param.mode != CHAIN_NONE && !session->use_callchain) { |
740 | callchain = 1; | 743 | session->use_callchain = true; |
741 | if (register_callchain_param(&callchain_param) < 0) { | 744 | if (register_callchain_param(&callchain_param) < 0) { |
742 | fprintf(stderr, "Can't register callchain" | 745 | fprintf(stderr, "Can't register callchain" |
743 | " params\n"); | 746 | " params\n"); |
@@ -769,6 +772,8 @@ static int __cmd_report(void) | |||
769 | if (session == NULL) | 772 | if (session == NULL) |
770 | return -ENOMEM; | 773 | return -ENOMEM; |
771 | 774 | ||
775 | session->use_callchain = use_callchain; | ||
776 | |||
772 | if (show_threads) | 777 | if (show_threads) |
773 | perf_read_values_init(&show_threads_values); | 778 | perf_read_values_init(&show_threads_values); |
774 | 779 | ||
@@ -787,9 +792,9 @@ static int __cmd_report(void) | |||
787 | if (verbose > 2) | 792 | if (verbose > 2) |
788 | dsos__fprintf(stdout); | 793 | dsos__fprintf(stdout); |
789 | 794 | ||
790 | collapse__resort(); | 795 | perf_session__collapse_resort(session); |
791 | output__resort(event__stats.total); | 796 | perf_session__output_resort(session, event__stats.total); |
792 | output__fprintf(stdout, event__stats.total); | 797 | perf_session__fprintf_hist_entries(session, event__stats.total, stdout); |
793 | 798 | ||
794 | if (show_threads) | 799 | if (show_threads) |
795 | perf_read_values_destroy(&show_threads_values); | 800 | perf_read_values_destroy(&show_threads_values); |
@@ -805,7 +810,7 @@ parse_callchain_opt(const struct option *opt __used, const char *arg, | |||
805 | char *tok; | 810 | char *tok; |
806 | char *endptr; | 811 | char *endptr; |
807 | 812 | ||
808 | callchain = 1; | 813 | use_callchain = true; |
809 | 814 | ||
810 | if (!arg) | 815 | if (!arg) |
811 | return 0; | 816 | return 0; |
@@ -826,7 +831,7 @@ parse_callchain_opt(const struct option *opt __used, const char *arg, | |||
826 | 831 | ||
827 | else if (!strncmp(tok, "none", strlen(arg))) { | 832 | else if (!strncmp(tok, "none", strlen(arg))) { |
828 | callchain_param.mode = CHAIN_NONE; | 833 | callchain_param.mode = CHAIN_NONE; |
829 | callchain = 0; | 834 | use_callchain = true; |
830 | 835 | ||
831 | return 0; | 836 | return 0; |
832 | } | 837 | } |
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index bce05dff6dfe..412ae924640a 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c | |||
@@ -1655,7 +1655,7 @@ static int process_lost_event(event_t *event __used, | |||
1655 | return 0; | 1655 | return 0; |
1656 | } | 1656 | } |
1657 | 1657 | ||
1658 | static int sample_type_check(u64 type) | 1658 | static int sample_type_check(u64 type, struct perf_session *session __used) |
1659 | { | 1659 | { |
1660 | sample_type = type; | 1660 | sample_type = type; |
1661 | 1661 | ||
diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c index 27018531404b..3a0a89e41523 100644 --- a/tools/perf/builtin-timechart.c +++ b/tools/perf/builtin-timechart.c | |||
@@ -1033,7 +1033,7 @@ static void process_samples(void) | |||
1033 | } | 1033 | } |
1034 | } | 1034 | } |
1035 | 1035 | ||
1036 | static int sample_type_check(u64 type) | 1036 | static int sample_type_check(u64 type, struct perf_session *session __used) |
1037 | { | 1037 | { |
1038 | sample_type = type; | 1038 | sample_type = type; |
1039 | 1039 | ||
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 9d89ae423ca5..adce442dd603 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c | |||
@@ -103,7 +103,7 @@ static int process_sample_event(event_t *event, struct perf_session *session) | |||
103 | return 0; | 103 | return 0; |
104 | } | 104 | } |
105 | 105 | ||
106 | static int sample_type_check(u64 type) | 106 | static int sample_type_check(u64 type, struct perf_session *session __used) |
107 | { | 107 | { |
108 | sample_type = type; | 108 | sample_type = type; |
109 | 109 | ||
diff --git a/tools/perf/util/data_map.c b/tools/perf/util/data_map.c index 44dea211cc65..08c4cf5e66ba 100644 --- a/tools/perf/util/data_map.c +++ b/tools/perf/util/data_map.c | |||
@@ -161,7 +161,7 @@ int perf_session__process_events(struct perf_session *self, | |||
161 | 161 | ||
162 | err = -EINVAL; | 162 | err = -EINVAL; |
163 | if (ops->sample_type_check && | 163 | if (ops->sample_type_check && |
164 | ops->sample_type_check(sample_type) < 0) | 164 | ops->sample_type_check(sample_type, self) < 0) |
165 | goto out_err; | 165 | goto out_err; |
166 | 166 | ||
167 | if (!ops->full_paths) { | 167 | if (!ops->full_paths) { |
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index b40e37ded4bf..b9828fce7bf0 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c | |||
@@ -1,7 +1,6 @@ | |||
1 | #include "hist.h" | 1 | #include "hist.h" |
2 | 2 | #include "session.h" | |
3 | struct rb_root hist; | 3 | #include "sort.h" |
4 | int callchain; | ||
5 | 4 | ||
6 | struct callchain_param callchain_param = { | 5 | struct callchain_param callchain_param = { |
7 | .mode = CHAIN_GRAPH_REL, | 6 | .mode = CHAIN_GRAPH_REL, |
@@ -12,11 +11,12 @@ struct callchain_param callchain_param = { | |||
12 | * histogram, sorted on item, collects counts | 11 | * histogram, sorted on item, collects counts |
13 | */ | 12 | */ |
14 | 13 | ||
15 | struct hist_entry *__hist_entry__add(struct addr_location *al, | 14 | struct hist_entry *__perf_session__add_hist_entry(struct perf_session *self, |
16 | struct symbol *sym_parent, | 15 | struct addr_location *al, |
17 | u64 count, bool *hit) | 16 | struct symbol *sym_parent, |
17 | u64 count, bool *hit) | ||
18 | { | 18 | { |
19 | struct rb_node **p = &hist.rb_node; | 19 | struct rb_node **p = &self->hists.rb_node; |
20 | struct rb_node *parent = NULL; | 20 | struct rb_node *parent = NULL; |
21 | struct hist_entry *he; | 21 | struct hist_entry *he; |
22 | struct hist_entry entry = { | 22 | struct hist_entry entry = { |
@@ -52,7 +52,7 @@ struct hist_entry *__hist_entry__add(struct addr_location *al, | |||
52 | return NULL; | 52 | return NULL; |
53 | *he = entry; | 53 | *he = entry; |
54 | rb_link_node(&he->rb_node, parent, p); | 54 | rb_link_node(&he->rb_node, parent, p); |
55 | rb_insert_color(&he->rb_node, &hist); | 55 | rb_insert_color(&he->rb_node, &self->hists); |
56 | *hit = false; | 56 | *hit = false; |
57 | return he; | 57 | return he; |
58 | } | 58 | } |
@@ -129,7 +129,7 @@ static void collapse__insert_entry(struct rb_root *root, struct hist_entry *he) | |||
129 | rb_insert_color(&he->rb_node, root); | 129 | rb_insert_color(&he->rb_node, root); |
130 | } | 130 | } |
131 | 131 | ||
132 | void collapse__resort(void) | 132 | void perf_session__collapse_resort(struct perf_session *self) |
133 | { | 133 | { |
134 | struct rb_root tmp; | 134 | struct rb_root tmp; |
135 | struct rb_node *next; | 135 | struct rb_node *next; |
@@ -139,31 +139,33 @@ void collapse__resort(void) | |||
139 | return; | 139 | return; |
140 | 140 | ||
141 | tmp = RB_ROOT; | 141 | tmp = RB_ROOT; |
142 | next = rb_first(&hist); | 142 | next = rb_first(&self->hists); |
143 | 143 | ||
144 | while (next) { | 144 | while (next) { |
145 | n = rb_entry(next, struct hist_entry, rb_node); | 145 | n = rb_entry(next, struct hist_entry, rb_node); |
146 | next = rb_next(&n->rb_node); | 146 | next = rb_next(&n->rb_node); |
147 | 147 | ||
148 | rb_erase(&n->rb_node, &hist); | 148 | rb_erase(&n->rb_node, &self->hists); |
149 | collapse__insert_entry(&tmp, n); | 149 | collapse__insert_entry(&tmp, n); |
150 | } | 150 | } |
151 | 151 | ||
152 | hist = tmp; | 152 | self->hists = tmp; |
153 | } | 153 | } |
154 | 154 | ||
155 | /* | 155 | /* |
156 | * reverse the map, sort on count. | 156 | * reverse the map, sort on count. |
157 | */ | 157 | */ |
158 | 158 | ||
159 | static void output__insert_entry(struct rb_root *root, struct hist_entry *he, | 159 | static void perf_session__insert_output_hist_entry(struct perf_session *self, |
160 | u64 min_callchain_hits) | 160 | struct rb_root *root, |
161 | struct hist_entry *he, | ||
162 | u64 min_callchain_hits) | ||
161 | { | 163 | { |
162 | struct rb_node **p = &root->rb_node; | 164 | struct rb_node **p = &root->rb_node; |
163 | struct rb_node *parent = NULL; | 165 | struct rb_node *parent = NULL; |
164 | struct hist_entry *iter; | 166 | struct hist_entry *iter; |
165 | 167 | ||
166 | if (callchain) | 168 | if (self->use_callchain) |
167 | callchain_param.sort(&he->sorted_chain, &he->callchain, | 169 | callchain_param.sort(&he->sorted_chain, &he->callchain, |
168 | min_callchain_hits, &callchain_param); | 170 | min_callchain_hits, &callchain_param); |
169 | 171 | ||
@@ -181,7 +183,7 @@ static void output__insert_entry(struct rb_root *root, struct hist_entry *he, | |||
181 | rb_insert_color(&he->rb_node, root); | 183 | rb_insert_color(&he->rb_node, root); |
182 | } | 184 | } |
183 | 185 | ||
184 | void output__resort(u64 total_samples) | 186 | void perf_session__output_resort(struct perf_session *self, u64 total_samples) |
185 | { | 187 | { |
186 | struct rb_root tmp; | 188 | struct rb_root tmp; |
187 | struct rb_node *next; | 189 | struct rb_node *next; |
@@ -192,15 +194,16 @@ void output__resort(u64 total_samples) | |||
192 | total_samples * (callchain_param.min_percent / 100); | 194 | total_samples * (callchain_param.min_percent / 100); |
193 | 195 | ||
194 | tmp = RB_ROOT; | 196 | tmp = RB_ROOT; |
195 | next = rb_first(&hist); | 197 | next = rb_first(&self->hists); |
196 | 198 | ||
197 | while (next) { | 199 | while (next) { |
198 | n = rb_entry(next, struct hist_entry, rb_node); | 200 | n = rb_entry(next, struct hist_entry, rb_node); |
199 | next = rb_next(&n->rb_node); | 201 | next = rb_next(&n->rb_node); |
200 | 202 | ||
201 | rb_erase(&n->rb_node, &hist); | 203 | rb_erase(&n->rb_node, &self->hists); |
202 | output__insert_entry(&tmp, n, min_callchain_hits); | 204 | perf_session__insert_output_hist_entry(self, &tmp, n, |
205 | min_callchain_hits); | ||
203 | } | 206 | } |
204 | 207 | ||
205 | hist = tmp; | 208 | self->hists = tmp; |
206 | } | 209 | } |
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h index a6cb1485e3b9..7efdb1b6d8c8 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h | |||
@@ -1,40 +1,25 @@ | |||
1 | #ifndef __PERF_HIST_H | 1 | #ifndef __PERF_HIST_H |
2 | #define __PERF_HIST_H | 2 | #define __PERF_HIST_H |
3 | #include "../builtin.h" | ||
4 | 3 | ||
5 | #include "util.h" | 4 | #include <linux/types.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 | #include "callchain.h" | 5 | #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 | 6 | ||
24 | #include "thread.h" | ||
25 | #include "sort.h" | ||
26 | |||
27 | extern struct rb_root hist; | ||
28 | extern int callchain; | ||
29 | extern struct callchain_param callchain_param; | 7 | extern struct callchain_param callchain_param; |
30 | 8 | ||
31 | struct hist_entry *__hist_entry__add(struct addr_location *al, | 9 | struct perf_session; |
32 | struct symbol *parent, | 10 | struct hist_entry; |
33 | u64 count, bool *hit); | 11 | struct addr_location; |
12 | struct symbol; | ||
13 | |||
14 | struct hist_entry *__perf_session__add_hist_entry(struct perf_session *self, | ||
15 | struct addr_location *al, | ||
16 | struct symbol *parent, | ||
17 | u64 count, bool *hit); | ||
34 | extern int64_t hist_entry__cmp(struct hist_entry *, struct hist_entry *); | 18 | extern int64_t hist_entry__cmp(struct hist_entry *, struct hist_entry *); |
35 | extern int64_t hist_entry__collapse(struct hist_entry *, struct hist_entry *); | 19 | extern int64_t hist_entry__collapse(struct hist_entry *, struct hist_entry *); |
36 | extern void hist_entry__free(struct hist_entry *); | 20 | void hist_entry__free(struct hist_entry *); |
37 | extern void collapse__resort(void); | 21 | |
38 | extern void output__resort(u64); | 22 | void perf_session__output_resort(struct perf_session *self, u64 total_samples); |
23 | void perf_session__collapse_resort(struct perf_session *self); | ||
39 | 24 | ||
40 | #endif /* __PERF_HIST_H */ | 25 | #endif /* __PERF_HIST_H */ |
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index 20b2c9cc834b..759d96022a39 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h | |||
@@ -16,10 +16,12 @@ struct perf_session { | |||
16 | struct map_groups kmaps; | 16 | struct map_groups kmaps; |
17 | struct rb_root threads; | 17 | struct rb_root threads; |
18 | struct thread *last_match; | 18 | struct thread *last_match; |
19 | struct rb_root hists; | ||
19 | int fd; | 20 | int fd; |
20 | int cwdlen; | 21 | int cwdlen; |
21 | char *cwd; | 22 | char *cwd; |
22 | bool use_modules; | 23 | bool use_modules; |
24 | bool use_callchain; | ||
23 | char filename[0]; | 25 | char filename[0]; |
24 | }; | 26 | }; |
25 | 27 | ||
@@ -35,7 +37,8 @@ struct perf_event_ops { | |||
35 | event_op process_read_event; | 37 | event_op process_read_event; |
36 | event_op process_throttle_event; | 38 | event_op process_throttle_event; |
37 | event_op process_unthrottle_event; | 39 | event_op process_unthrottle_event; |
38 | int (*sample_type_check)(u64 sample_type); | 40 | int (*sample_type_check)(u64 sample_type, |
41 | struct perf_session *session); | ||
39 | unsigned long total_unknown; | 42 | unsigned long total_unknown; |
40 | bool full_paths; | 43 | bool full_paths; |
41 | }; | 44 | }; |