perf hists browser: Fix percentage update on key press
Currently 'perf top --tui' decrements percentage of all entries on any
key press. This is because it adds total period as new samples are
added to hists. As perf-top does it currently but added samples are not
passed to the display thread, the percentages are decresing
continuously.
So separate total period stat into a different variable so that it
cannot affect the output total period. This new total period stats are
used only for calcualating callchain percent limit.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Wang Nan <wangnan0@huawei.com>
Fixes: 0f58474ec8
("perf hists: Update hists' total period when adding entries")
Link: http://lkml.kernel.org/r/1455631723-17345-2-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
43d0b97817
Коммит
467ef10c68
|
@ -405,6 +405,16 @@ static u8 symbol__parent_filter(const struct symbol *parent)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void hist_entry__add_callchain_period(struct hist_entry *he, u64 period)
|
||||
{
|
||||
if (!symbol_conf.use_callchain)
|
||||
return;
|
||||
|
||||
he->hists->callchain_period += period;
|
||||
if (!he->filtered)
|
||||
he->hists->callchain_non_filtered_period += period;
|
||||
}
|
||||
|
||||
static struct hist_entry *hists__findnew_entry(struct hists *hists,
|
||||
struct hist_entry *entry,
|
||||
struct addr_location *al,
|
||||
|
@ -434,9 +444,7 @@ static struct hist_entry *hists__findnew_entry(struct hists *hists,
|
|||
if (!cmp) {
|
||||
if (sample_self) {
|
||||
he_stat__add_period(&he->stat, period, weight);
|
||||
hists->stats.total_period += period;
|
||||
if (!he->filtered)
|
||||
hists->stats.total_non_filtered_period += period;
|
||||
hist_entry__add_callchain_period(he, period);
|
||||
}
|
||||
if (symbol_conf.cumulate_callchain)
|
||||
he_stat__add_period(he->stat_acc, period, weight);
|
||||
|
@ -471,9 +479,8 @@ static struct hist_entry *hists__findnew_entry(struct hists *hists,
|
|||
return NULL;
|
||||
|
||||
if (sample_self)
|
||||
hists__inc_stats(hists, he);
|
||||
else
|
||||
hists->nr_entries++;
|
||||
hist_entry__add_callchain_period(he, period);
|
||||
hists->nr_entries++;
|
||||
|
||||
rb_link_node(&he->rb_node_in, parent, p);
|
||||
rb_insert_color(&he->rb_node_in, hists->entries_in);
|
||||
|
@ -1227,9 +1234,14 @@ static void output_resort(struct hists *hists, struct ui_progress *prog,
|
|||
struct rb_root *root;
|
||||
struct rb_node *next;
|
||||
struct hist_entry *n;
|
||||
u64 callchain_total;
|
||||
u64 min_callchain_hits;
|
||||
|
||||
min_callchain_hits = hists__total_period(hists) * (callchain_param.min_percent / 100);
|
||||
callchain_total = hists->callchain_period;
|
||||
if (symbol_conf.filter_relative)
|
||||
callchain_total = hists->callchain_non_filtered_period;
|
||||
|
||||
min_callchain_hits = callchain_total * (callchain_param.min_percent / 100);
|
||||
|
||||
if (sort__need_collapse)
|
||||
root = &hists->entries_collapsed;
|
||||
|
|
|
@ -66,6 +66,8 @@ struct hists {
|
|||
struct rb_root entries_collapsed;
|
||||
u64 nr_entries;
|
||||
u64 nr_non_filtered_entries;
|
||||
u64 callchain_period;
|
||||
u64 callchain_non_filtered_period;
|
||||
struct thread *thread_filter;
|
||||
const struct dso *dso_filter;
|
||||
const char *uid_filter_str;
|
||||
|
|
Загрузка…
Ссылка в новой задаче