aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/ui/browsers
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung@kernel.org>2014-04-22 02:56:17 -0400
committerJiri Olsa <jolsa@kernel.org>2014-04-24 10:34:27 -0400
commitc3b789527b236873557f53740ceac47747e0e1cb (patch)
treef5f9b8a43992a7fa6c77bb62ec0fcf41236a40d6 /tools/perf/ui/browsers
parent268397cb2a47ce6e1c0298d9de1762143867f9d3 (diff)
perf hists/tui: Count callchain rows separately
When TUI hist browser expands/collapses callchains it accounted number of callchain nodes into total entries to show. However this code ignores filtering so that it can make the cursor go to out of screen. Thanks to Jiri Olsa for pointing out a bug (and a fix) in the code. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Link: http://lkml.kernel.org/r/1398327843-31845-12-git-send-email-namhyung@kernel.org Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Diffstat (limited to 'tools/perf/ui/browsers')
-rw-r--r--tools/perf/ui/browsers/hists.c63
1 files changed, 43 insertions, 20 deletions
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index 886eee0062e0..b0861e3e50a5 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -27,6 +27,7 @@ struct hist_browser {
27 bool show_dso; 27 bool show_dso;
28 float min_pcnt; 28 float min_pcnt;
29 u64 nr_non_filtered_entries; 29 u64 nr_non_filtered_entries;
30 u64 nr_callchain_rows;
30}; 31};
31 32
32extern void hist_browser__init_hpp(void); 33extern void hist_browser__init_hpp(void);
@@ -35,11 +36,27 @@ static int hists__browser_title(struct hists *hists, char *bf, size_t size,
35 const char *ev_name); 36 const char *ev_name);
36static void hist_browser__update_nr_entries(struct hist_browser *hb); 37static void hist_browser__update_nr_entries(struct hist_browser *hb);
37 38
39static struct rb_node *hists__filter_entries(struct rb_node *nd,
40 struct hists *hists,
41 float min_pcnt);
42
38static bool hist_browser__has_filter(struct hist_browser *hb) 43static bool hist_browser__has_filter(struct hist_browser *hb)
39{ 44{
40 return hists__has_filter(hb->hists) || hb->min_pcnt; 45 return hists__has_filter(hb->hists) || hb->min_pcnt;
41} 46}
42 47
48static u32 hist_browser__nr_entries(struct hist_browser *hb)
49{
50 u32 nr_entries;
51
52 if (hist_browser__has_filter(hb))
53 nr_entries = hb->nr_non_filtered_entries;
54 else
55 nr_entries = hb->hists->nr_entries;
56
57 return nr_entries + hb->nr_callchain_rows;
58}
59
43static void hist_browser__refresh_dimensions(struct hist_browser *browser) 60static void hist_browser__refresh_dimensions(struct hist_browser *browser)
44{ 61{
45 /* 3 == +/- toggle symbol before actual hist_entry rendering */ 62 /* 3 == +/- toggle symbol before actual hist_entry rendering */
@@ -49,8 +66,14 @@ static void hist_browser__refresh_dimensions(struct hist_browser *browser)
49 66
50static void hist_browser__reset(struct hist_browser *browser) 67static void hist_browser__reset(struct hist_browser *browser)
51{ 68{
69 /*
70 * The hists__remove_entry_filter() already folds non-filtered
71 * entries so we can assume it has 0 callchain rows.
72 */
73 browser->nr_callchain_rows = 0;
74
52 hist_browser__update_nr_entries(browser); 75 hist_browser__update_nr_entries(browser);
53 browser->b.nr_entries = browser->nr_non_filtered_entries; 76 browser->b.nr_entries = hist_browser__nr_entries(browser);
54 hist_browser__refresh_dimensions(browser); 77 hist_browser__refresh_dimensions(browser);
55 ui_browser__reset_index(&browser->b); 78 ui_browser__reset_index(&browser->b);
56} 79}
@@ -205,14 +228,16 @@ static bool hist_browser__toggle_fold(struct hist_browser *browser)
205 struct hist_entry *he = browser->he_selection; 228 struct hist_entry *he = browser->he_selection;
206 229
207 hist_entry__init_have_children(he); 230 hist_entry__init_have_children(he);
208 browser->hists->nr_entries -= he->nr_rows; 231 browser->b.nr_entries -= he->nr_rows;
232 browser->nr_callchain_rows -= he->nr_rows;
209 233
210 if (he->ms.unfolded) 234 if (he->ms.unfolded)
211 he->nr_rows = callchain__count_rows(&he->sorted_chain); 235 he->nr_rows = callchain__count_rows(&he->sorted_chain);
212 else 236 else
213 he->nr_rows = 0; 237 he->nr_rows = 0;
214 browser->hists->nr_entries += he->nr_rows; 238
215 browser->b.nr_entries = browser->hists->nr_entries; 239 browser->b.nr_entries += he->nr_rows;
240 browser->nr_callchain_rows += he->nr_rows;
216 241
217 return true; 242 return true;
218 } 243 }
@@ -287,23 +312,27 @@ static void hist_entry__set_folding(struct hist_entry *he, bool unfold)
287 he->nr_rows = 0; 312 he->nr_rows = 0;
288} 313}
289 314
290static void hists__set_folding(struct hists *hists, bool unfold) 315static void
316__hist_browser__set_folding(struct hist_browser *browser, bool unfold)
291{ 317{
292 struct rb_node *nd; 318 struct rb_node *nd;
319 struct hists *hists = browser->hists;
293 320
294 hists->nr_entries = 0; 321 for (nd = rb_first(&hists->entries);
295 322 (nd = hists__filter_entries(nd, hists, browser->min_pcnt)) != NULL;
296 for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) { 323 nd = rb_next(nd)) {
297 struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node); 324 struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node);
298 hist_entry__set_folding(he, unfold); 325 hist_entry__set_folding(he, unfold);
299 hists->nr_entries += 1 + he->nr_rows; 326 browser->nr_callchain_rows += he->nr_rows;
300 } 327 }
301} 328}
302 329
303static void hist_browser__set_folding(struct hist_browser *browser, bool unfold) 330static void hist_browser__set_folding(struct hist_browser *browser, bool unfold)
304{ 331{
305 hists__set_folding(browser->hists, unfold); 332 browser->nr_callchain_rows = 0;
306 browser->b.nr_entries = browser->hists->nr_entries; 333 __hist_browser__set_folding(browser, unfold);
334
335 browser->b.nr_entries = hist_browser__nr_entries(browser);
307 /* Go to the start, we may be way after valid entries after a collapse */ 336 /* Go to the start, we may be way after valid entries after a collapse */
308 ui_browser__reset_index(&browser->b); 337 ui_browser__reset_index(&browser->b);
309} 338}
@@ -325,10 +354,7 @@ static int hist_browser__run(struct hist_browser *browser, const char *ev_name,
325 int delay_secs = hbt ? hbt->refresh : 0; 354 int delay_secs = hbt ? hbt->refresh : 0;
326 355
327 browser->b.entries = &browser->hists->entries; 356 browser->b.entries = &browser->hists->entries;
328 if (hist_browser__has_filter(browser)) 357 browser->b.nr_entries = hist_browser__nr_entries(browser);
329 browser->b.nr_entries = browser->nr_non_filtered_entries;
330 else
331 browser->b.nr_entries = browser->hists->nr_entries;
332 358
333 hist_browser__refresh_dimensions(browser); 359 hist_browser__refresh_dimensions(browser);
334 hists__browser_title(browser->hists, title, sizeof(title), ev_name); 360 hists__browser_title(browser->hists, title, sizeof(title), ev_name);
@@ -345,13 +371,10 @@ static int hist_browser__run(struct hist_browser *browser, const char *ev_name,
345 u64 nr_entries; 371 u64 nr_entries;
346 hbt->timer(hbt->arg); 372 hbt->timer(hbt->arg);
347 373
348 if (hist_browser__has_filter(browser)) { 374 if (hist_browser__has_filter(browser))
349 hist_browser__update_nr_entries(browser); 375 hist_browser__update_nr_entries(browser);
350 nr_entries = browser->nr_non_filtered_entries;
351 } else {
352 nr_entries = browser->hists->nr_entries;
353 }
354 376
377 nr_entries = hist_browser__nr_entries(browser);
355 ui_browser__update_nr_entries(&browser->b, nr_entries); 378 ui_browser__update_nr_entries(&browser->b, nr_entries);
356 379
357 if (browser->hists->stats.nr_lost_warned != 380 if (browser->hists->stats.nr_lost_warned !=