aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/hist.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/hist.c')
-rw-r--r--tools/perf/util/hist.c55
1 files changed, 46 insertions, 9 deletions
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index fdff2a8288b4..75526d123eb2 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -6,6 +6,11 @@
6#include "sort.h" 6#include "sort.h"
7#include <math.h> 7#include <math.h>
8 8
9static bool hists__filter_entry_by_dso(struct hists *hists,
10 struct hist_entry *he);
11static bool hists__filter_entry_by_thread(struct hists *hists,
12 struct hist_entry *he);
13
9enum hist_filter { 14enum hist_filter {
10 HIST_FILTER__DSO, 15 HIST_FILTER__DSO,
11 HIST_FILTER__THREAD, 16 HIST_FILTER__THREAD,
@@ -338,6 +343,12 @@ static struct rb_root *hists__get_rotate_entries_in(struct hists *hists)
338 return root; 343 return root;
339} 344}
340 345
346static void hists__apply_filters(struct hists *hists, struct hist_entry *he)
347{
348 hists__filter_entry_by_dso(hists, he);
349 hists__filter_entry_by_thread(hists, he);
350}
351
341static void __hists__collapse_resort(struct hists *hists, bool threaded) 352static void __hists__collapse_resort(struct hists *hists, bool threaded)
342{ 353{
343 struct rb_root *root; 354 struct rb_root *root;
@@ -356,8 +367,15 @@ static void __hists__collapse_resort(struct hists *hists, bool threaded)
356 next = rb_next(&n->rb_node_in); 367 next = rb_next(&n->rb_node_in);
357 368
358 rb_erase(&n->rb_node_in, root); 369 rb_erase(&n->rb_node_in, root);
359 if (hists__collapse_insert_entry(hists, &hists->entries_collapsed, n)) 370 if (hists__collapse_insert_entry(hists, &hists->entries_collapsed, n)) {
371 /*
372 * If it wasn't combined with one of the entries already
373 * collapsed, we need to apply the filters that may have
374 * been set by, say, the hist_browser.
375 */
376 hists__apply_filters(hists, n);
360 hists__inc_nr_entries(hists, n); 377 hists__inc_nr_entries(hists, n);
378 }
361 } 379 }
362} 380}
363 381
@@ -1087,6 +1105,19 @@ static void hists__remove_entry_filter(struct hists *hists, struct hist_entry *h
1087 hists__calc_col_len(hists, h); 1105 hists__calc_col_len(hists, h);
1088} 1106}
1089 1107
1108
1109static bool hists__filter_entry_by_dso(struct hists *hists,
1110 struct hist_entry *he)
1111{
1112 if (hists->dso_filter != NULL &&
1113 (he->ms.map == NULL || he->ms.map->dso != hists->dso_filter)) {
1114 he->filtered |= (1 << HIST_FILTER__DSO);
1115 return true;
1116 }
1117
1118 return false;
1119}
1120
1090void hists__filter_by_dso(struct hists *hists) 1121void hists__filter_by_dso(struct hists *hists)
1091{ 1122{
1092 struct rb_node *nd; 1123 struct rb_node *nd;
@@ -1101,16 +1132,25 @@ void hists__filter_by_dso(struct hists *hists)
1101 if (symbol_conf.exclude_other && !h->parent) 1132 if (symbol_conf.exclude_other && !h->parent)
1102 continue; 1133 continue;
1103 1134
1104 if (hists->dso_filter != NULL && 1135 if (hists__filter_entry_by_dso(hists, h))
1105 (h->ms.map == NULL || h->ms.map->dso != hists->dso_filter)) {
1106 h->filtered |= (1 << HIST_FILTER__DSO);
1107 continue; 1136 continue;
1108 }
1109 1137
1110 hists__remove_entry_filter(hists, h, HIST_FILTER__DSO); 1138 hists__remove_entry_filter(hists, h, HIST_FILTER__DSO);
1111 } 1139 }
1112} 1140}
1113 1141
1142static bool hists__filter_entry_by_thread(struct hists *hists,
1143 struct hist_entry *he)
1144{
1145 if (hists->thread_filter != NULL &&
1146 he->thread != hists->thread_filter) {
1147 he->filtered |= (1 << HIST_FILTER__THREAD);
1148 return true;
1149 }
1150
1151 return false;
1152}
1153
1114void hists__filter_by_thread(struct hists *hists) 1154void hists__filter_by_thread(struct hists *hists)
1115{ 1155{
1116 struct rb_node *nd; 1156 struct rb_node *nd;
@@ -1122,11 +1162,8 @@ void hists__filter_by_thread(struct hists *hists)
1122 for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) { 1162 for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) {
1123 struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node); 1163 struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
1124 1164
1125 if (hists->thread_filter != NULL && 1165 if (hists__filter_entry_by_thread(hists, h))
1126 h->thread != hists->thread_filter) {
1127 h->filtered |= (1 << HIST_FILTER__THREAD);
1128 continue; 1166 continue;
1129 }
1130 1167
1131 hists__remove_entry_filter(hists, h, HIST_FILTER__THREAD); 1168 hists__remove_entry_filter(hists, h, HIST_FILTER__THREAD);
1132 } 1169 }