Re: [PATCH 9/9] perf hists/tui: Count callchain rows separately

From: Jiri Olsa
Date: Tue Apr 22 2014 - 13:39:44 EST


On Tue, Apr 22, 2014 at 05:49:51PM +0900, Namhyung Kim wrote:
> 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.
>
> Signed-off-by: Namhyung Kim <namhyung@xxxxxxxxxx>
> ---
> tools/perf/ui/browsers/hists.c | 38 ++++++++++++++++++++++++++++----------
> 1 file changed, 28 insertions(+), 10 deletions(-)
>
> diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
> index 886eee0062e0..215f10429dda 100644
> --- a/tools/perf/ui/browsers/hists.c
> +++ b/tools/perf/ui/browsers/hists.c
> @@ -27,6 +27,7 @@ struct hist_browser {
> bool show_dso;
> float min_pcnt;
> u64 nr_non_filtered_entries;
> + u64 nr_callchain_rows;
> };
>
> extern void hist_browser__init_hpp(void);
> @@ -35,6 +36,10 @@ static int hists__browser_title(struct hists *hists, char *bf, size_t size,
> const char *ev_name);
> static void hist_browser__update_nr_entries(struct hist_browser *hb);
>
> +static struct rb_node *hists__filter_entries(struct rb_node *nd,
> + struct hists *hists,
> + float min_pcnt);
> +
> static bool hist_browser__has_filter(struct hist_browser *hb)
> {
> return hists__has_filter(hb->hists) || hb->min_pcnt;
> @@ -51,6 +56,7 @@ static void hist_browser__reset(struct hist_browser *browser)
> {
> hist_browser__update_nr_entries(browser);
> browser->b.nr_entries = browser->nr_non_filtered_entries;
> + browser->b.nr_entries += browser->nr_callchain_rows;
> hist_browser__refresh_dimensions(browser);
> ui_browser__reset_index(&browser->b);
> }
> @@ -205,14 +211,16 @@ static bool hist_browser__toggle_fold(struct hist_browser *browser)
> struct hist_entry *he = browser->he_selection;
>
> hist_entry__init_have_children(he);
> - browser->hists->nr_entries -= he->nr_rows;
> + browser->b.nr_entries -= he->nr_rows;

does browser->b.nr_entries need to be updated in here?

it gets set in hist_browser__reset and hist_browser__run

> + browser->nr_callchain_rows -= he->nr_rows;
>
> if (he->ms.unfolded)
> he->nr_rows = callchain__count_rows(&he->sorted_chain);
> else
> he->nr_rows = 0;
> - browser->hists->nr_entries += he->nr_rows;
> - browser->b.nr_entries = browser->hists->nr_entries;
> +
> + browser->b.nr_entries += he->nr_rows;

ditto

> + browser->nr_callchain_rows += he->nr_rows;
>
> return true;
> }
> @@ -287,23 +295,31 @@ static void hist_entry__set_folding(struct hist_entry *he, bool unfold)
> he->nr_rows = 0;
> }
>
> -static void hists__set_folding(struct hists *hists, bool unfold)
> +static void
> +__hist_browser__set_folding(struct hist_browser *browser, bool unfold)
> {
> struct rb_node *nd;
> + struct hists *hists = browser->hists;
>
> - hists->nr_entries = 0;
> -
> - for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) {
> + for (nd = rb_first(&hists->entries);
> + (nd = hists__filter_entries(nd, hists, browser->min_pcnt)) != NULL;
> + nd = rb_next(nd)) {
> struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node);
> hist_entry__set_folding(he, unfold);
> - hists->nr_entries += 1 + he->nr_rows;
> + browser->nr_callchain_rows += he->nr_rows;
> }
> }
>
> static void hist_browser__set_folding(struct hist_browser *browser, bool unfold)
> {
> - hists__set_folding(browser->hists, unfold);
> - browser->b.nr_entries = browser->hists->nr_entries;
> + browser->nr_callchain_rows = 0;
> + __hist_browser__set_folding(browser, unfold);
> +
> + if (hist_browser__has_filter(browser))
> + browser->b.nr_entries = browser->nr_non_filtered_entries;
> + else
> + browser->b.nr_entries = browser->hists->nr_entries;
> + browser->b.nr_entries += browser->nr_callchain_rows;

ditto,

I think whole condition above could go away, it's the same as in the
hist_browser__run, which is going to be executed after this anyway..

just setup browser->nr_callchain_rows


thanks,
jirka
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/