aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung@kernel.org>2013-12-26 01:11:52 -0500
committerJiri Olsa <jolsa@redhat.com>2014-04-16 11:16:03 -0400
commit1ab1fa5dfb429c533fbc791e524788cf0cc43775 (patch)
tree498386cc0e6342a7228e86f3a59da86179e62e5a /tools
parentfbdd17ec5ce2e5e4027356fcfde769b88d15702f (diff)
perf hists: Add support for showing relative percentage
When filtering by thread, dso or symbol on TUI it also update total period so that the output shows different result than no filter - the percentage changed to relative to filtered entries only. Sometimes this is not desired since users might expect same results with filter. So new filtered_* fields to hists->stats to count them separately. They'll be controlled/used by user later. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Link: http://lkml.kernel.org/r/1397145720-8063-2-git-send-email-namhyung@kernel.org Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/perf/builtin-report.c6
-rw-r--r--tools/perf/builtin-top.c3
-rw-r--r--tools/perf/util/hist.c17
-rw-r--r--tools/perf/util/hist.h3
4 files changed, 26 insertions, 3 deletions
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index c8f21137dfd8..2fca56c9d68a 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -123,6 +123,8 @@ static int report__add_mem_hist_entry(struct report *rep, struct addr_location *
123 123
124 evsel->hists.stats.total_period += cost; 124 evsel->hists.stats.total_period += cost;
125 hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); 125 hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
126 if (!he->filtered)
127 evsel->hists.stats.nr_non_filtered_samples++;
126 err = hist_entry__append_callchain(he, sample); 128 err = hist_entry__append_callchain(he, sample);
127out: 129out:
128 return err; 130 return err;
@@ -176,6 +178,8 @@ static int report__add_branch_hist_entry(struct report *rep, struct addr_locatio
176 178
177 evsel->hists.stats.total_period += 1; 179 evsel->hists.stats.total_period += 1;
178 hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); 180 hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
181 if (!he->filtered)
182 evsel->hists.stats.nr_non_filtered_samples++;
179 } else 183 } else
180 goto out; 184 goto out;
181 } 185 }
@@ -209,6 +213,8 @@ static int report__add_hist_entry(struct report *rep, struct perf_evsel *evsel,
209 err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr); 213 err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr);
210 214
211 evsel->hists.stats.total_period += sample->period; 215 evsel->hists.stats.total_period += sample->period;
216 if (!he->filtered)
217 evsel->hists.stats.nr_non_filtered_samples++;
212 hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); 218 hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
213out: 219out:
214 return err; 220 return err;
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 65aaa5bbf7ec..25269014164a 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -253,6 +253,9 @@ static struct hist_entry *perf_evsel__add_hist_entry(struct perf_evsel *evsel,
253 return NULL; 253 return NULL;
254 254
255 hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); 255 hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
256 if (!he->filtered)
257 evsel->hists.stats.nr_non_filtered_samples++;
258
256 return he; 259 return he;
257} 260}
258 261
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index f38590d7561b..1ed3e2b86f0b 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -674,8 +674,8 @@ void hists__output_resort(struct hists *hists)
674 next = rb_first(root); 674 next = rb_first(root);
675 hists->entries = RB_ROOT; 675 hists->entries = RB_ROOT;
676 676
677 hists->nr_entries = 0; 677 hists->nr_entries = hists->nr_non_filtered_entries = 0;
678 hists->stats.total_period = 0; 678 hists->stats.total_period = hists->stats.total_non_filtered_period = 0;
679 hists__reset_col_len(hists); 679 hists__reset_col_len(hists);
680 680
681 while (next) { 681 while (next) {
@@ -695,11 +695,16 @@ static void hists__remove_entry_filter(struct hists *hists, struct hist_entry *h
695 return; 695 return;
696 696
697 ++hists->nr_entries; 697 ++hists->nr_entries;
698 if (h->ms.unfolded) 698 ++hists->nr_non_filtered_entries;
699 if (h->ms.unfolded) {
699 hists->nr_entries += h->nr_rows; 700 hists->nr_entries += h->nr_rows;
701 hists->nr_non_filtered_entries += h->nr_rows;
702 }
700 h->row_offset = 0; 703 h->row_offset = 0;
701 hists->stats.total_period += h->stat.period; 704 hists->stats.total_period += h->stat.period;
705 hists->stats.total_non_filtered_period += h->stat.period;
702 hists->stats.nr_events[PERF_RECORD_SAMPLE] += h->stat.nr_events; 706 hists->stats.nr_events[PERF_RECORD_SAMPLE] += h->stat.nr_events;
707 hists->stats.nr_non_filtered_samples += h->stat.nr_events;
703 708
704 hists__calc_col_len(hists, h); 709 hists__calc_col_len(hists, h);
705} 710}
@@ -722,7 +727,9 @@ void hists__filter_by_dso(struct hists *hists)
722 struct rb_node *nd; 727 struct rb_node *nd;
723 728
724 hists->nr_entries = hists->stats.total_period = 0; 729 hists->nr_entries = hists->stats.total_period = 0;
730 hists->nr_non_filtered_entries = hists->stats.total_non_filtered_period = 0;
725 hists->stats.nr_events[PERF_RECORD_SAMPLE] = 0; 731 hists->stats.nr_events[PERF_RECORD_SAMPLE] = 0;
732 hists->stats.nr_non_filtered_samples = 0;
726 hists__reset_col_len(hists); 733 hists__reset_col_len(hists);
727 734
728 for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) { 735 for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) {
@@ -755,7 +762,9 @@ void hists__filter_by_thread(struct hists *hists)
755 struct rb_node *nd; 762 struct rb_node *nd;
756 763
757 hists->nr_entries = hists->stats.total_period = 0; 764 hists->nr_entries = hists->stats.total_period = 0;
765 hists->nr_non_filtered_entries = hists->stats.total_non_filtered_period = 0;
758 hists->stats.nr_events[PERF_RECORD_SAMPLE] = 0; 766 hists->stats.nr_events[PERF_RECORD_SAMPLE] = 0;
767 hists->stats.nr_non_filtered_samples = 0;
759 hists__reset_col_len(hists); 768 hists__reset_col_len(hists);
760 769
761 for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) { 770 for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) {
@@ -786,7 +795,9 @@ void hists__filter_by_symbol(struct hists *hists)
786 struct rb_node *nd; 795 struct rb_node *nd;
787 796
788 hists->nr_entries = hists->stats.total_period = 0; 797 hists->nr_entries = hists->stats.total_period = 0;
798 hists->nr_non_filtered_entries = hists->stats.total_non_filtered_period = 0;
789 hists->stats.nr_events[PERF_RECORD_SAMPLE] = 0; 799 hists->stats.nr_events[PERF_RECORD_SAMPLE] = 0;
800 hists->stats.nr_non_filtered_samples = 0;
790 hists__reset_col_len(hists); 801 hists__reset_col_len(hists);
791 802
792 for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) { 803 for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) {
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index 1f1f513dfe7f..213551469f36 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -37,9 +37,11 @@ enum hist_filter {
37 */ 37 */
38struct events_stats { 38struct events_stats {
39 u64 total_period; 39 u64 total_period;
40 u64 total_non_filtered_period;
40 u64 total_lost; 41 u64 total_lost;
41 u64 total_invalid_chains; 42 u64 total_invalid_chains;
42 u32 nr_events[PERF_RECORD_HEADER_MAX]; 43 u32 nr_events[PERF_RECORD_HEADER_MAX];
44 u32 nr_non_filtered_samples;
43 u32 nr_lost_warned; 45 u32 nr_lost_warned;
44 u32 nr_unknown_events; 46 u32 nr_unknown_events;
45 u32 nr_invalid_chains; 47 u32 nr_invalid_chains;
@@ -83,6 +85,7 @@ struct hists {
83 struct rb_root entries; 85 struct rb_root entries;
84 struct rb_root entries_collapsed; 86 struct rb_root entries_collapsed;
85 u64 nr_entries; 87 u64 nr_entries;
88 u64 nr_non_filtered_entries;
86 const struct thread *thread_filter; 89 const struct thread *thread_filter;
87 const struct dso *dso_filter; 90 const struct dso *dso_filter;
88 const char *uid_filter_str; 91 const char *uid_filter_str;