提交 c1fb5651 编写于 作者: N Namhyung Kim 提交者: Arnaldo Carvalho de Melo

perf tools: Show progress on histogram collapsing

It can take quite amount of time so add progress bar UI to inform user.
Signed-off-by: NNamhyung Kim <namhyung@kernel.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1381468543-25334-4-git-send-email-namhyung@kernel.org
[ perf_progress -> ui_progress ]
Signed-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
上级 4d3001fd
...@@ -247,7 +247,7 @@ static int __cmd_annotate(struct perf_annotate *ann) ...@@ -247,7 +247,7 @@ static int __cmd_annotate(struct perf_annotate *ann)
if (nr_samples > 0) { if (nr_samples > 0) {
total_nr_samples += nr_samples; total_nr_samples += nr_samples;
hists__collapse_resort(hists); hists__collapse_resort(hists, NULL);
hists__output_resort(hists); hists__output_resort(hists);
if (symbol_conf.event_group && if (symbol_conf.event_group &&
......
...@@ -369,7 +369,7 @@ static void perf_evlist__collapse_resort(struct perf_evlist *evlist) ...@@ -369,7 +369,7 @@ static void perf_evlist__collapse_resort(struct perf_evlist *evlist)
list_for_each_entry(evsel, &evlist->entries, node) { list_for_each_entry(evsel, &evlist->entries, node) {
struct hists *hists = &evsel->hists; struct hists *hists = &evsel->hists;
hists__collapse_resort(hists); hists__collapse_resort(hists, NULL);
} }
} }
......
...@@ -496,6 +496,7 @@ static int __cmd_report(struct perf_report *rep) ...@@ -496,6 +496,7 @@ static int __cmd_report(struct perf_report *rep)
struct map *kernel_map; struct map *kernel_map;
struct kmap *kernel_kmap; struct kmap *kernel_kmap;
const char *help = "For a higher level overview, try: perf report --sort comm,dso"; const char *help = "For a higher level overview, try: perf report --sort comm,dso";
struct ui_progress prog;
struct perf_data_file *file = session->file; struct perf_data_file *file = session->file;
signal(SIGINT, sig_handler); signal(SIGINT, sig_handler);
...@@ -557,6 +558,12 @@ static int __cmd_report(struct perf_report *rep) ...@@ -557,6 +558,12 @@ static int __cmd_report(struct perf_report *rep)
return 0; return 0;
} }
nr_samples = 0;
list_for_each_entry(pos, &session->evlist->entries, node)
nr_samples += pos->hists.nr_entries;
ui_progress__init(&prog, nr_samples, "Merging related events...");
nr_samples = 0; nr_samples = 0;
list_for_each_entry(pos, &session->evlist->entries, node) { list_for_each_entry(pos, &session->evlist->entries, node) {
struct hists *hists = &pos->hists; struct hists *hists = &pos->hists;
...@@ -564,7 +571,7 @@ static int __cmd_report(struct perf_report *rep) ...@@ -564,7 +571,7 @@ static int __cmd_report(struct perf_report *rep)
if (pos->idx == 0) if (pos->idx == 0)
hists->symbol_filter_str = rep->symbol_filter_str; hists->symbol_filter_str = rep->symbol_filter_str;
hists__collapse_resort(hists); hists__collapse_resort(hists, &prog);
nr_samples += hists->stats.nr_events[PERF_RECORD_SAMPLE]; nr_samples += hists->stats.nr_events[PERF_RECORD_SAMPLE];
/* Non-group events are considered as leader */ /* Non-group events are considered as leader */
...@@ -576,6 +583,7 @@ static int __cmd_report(struct perf_report *rep) ...@@ -576,6 +583,7 @@ static int __cmd_report(struct perf_report *rep)
hists__link(leader_hists, hists); hists__link(leader_hists, hists);
} }
} }
ui_progress__finish();
if (session_done()) if (session_done())
return 0; return 0;
......
...@@ -286,7 +286,7 @@ static void perf_top__print_sym_table(struct perf_top *top) ...@@ -286,7 +286,7 @@ static void perf_top__print_sym_table(struct perf_top *top)
return; return;
} }
hists__collapse_resort(&top->sym_evsel->hists); hists__collapse_resort(&top->sym_evsel->hists, NULL);
hists__output_resort(&top->sym_evsel->hists); hists__output_resort(&top->sym_evsel->hists);
hists__decay_entries(&top->sym_evsel->hists, hists__decay_entries(&top->sym_evsel->hists,
top->hide_user_symbols, top->hide_user_symbols,
...@@ -552,7 +552,7 @@ static void perf_top__sort_new_samples(void *arg) ...@@ -552,7 +552,7 @@ static void perf_top__sort_new_samples(void *arg)
if (t->evlist->selected != NULL) if (t->evlist->selected != NULL)
t->sym_evsel = t->evlist->selected; t->sym_evsel = t->evlist->selected;
hists__collapse_resort(&t->sym_evsel->hists); hists__collapse_resort(&t->sym_evsel->hists, NULL);
hists__output_resort(&t->sym_evsel->hists); hists__output_resort(&t->sym_evsel->hists);
hists__decay_entries(&t->sym_evsel->hists, hists__decay_entries(&t->sym_evsel->hists,
t->hide_user_symbols, t->hide_user_symbols,
......
...@@ -467,7 +467,7 @@ int test__hists_link(void) ...@@ -467,7 +467,7 @@ int test__hists_link(void)
goto out; goto out;
list_for_each_entry(evsel, &evlist->entries, node) { list_for_each_entry(evsel, &evlist->entries, node) {
hists__collapse_resort(&evsel->hists); hists__collapse_resort(&evsel->hists, NULL);
if (verbose > 2) if (verbose > 2)
print_hists(&evsel->hists); print_hists(&evsel->hists);
......
...@@ -399,6 +399,7 @@ static struct hist_entry *add_hist_entry(struct hists *hists, ...@@ -399,6 +399,7 @@ static struct hist_entry *add_hist_entry(struct hists *hists,
if (!he) if (!he)
return NULL; return NULL;
hists->nr_entries++;
rb_link_node(&he->rb_node_in, parent, p); rb_link_node(&he->rb_node_in, parent, p);
rb_insert_color(&he->rb_node_in, hists->entries_in); rb_insert_color(&he->rb_node_in, hists->entries_in);
out: out:
...@@ -604,7 +605,7 @@ static void hists__apply_filters(struct hists *hists, struct hist_entry *he) ...@@ -604,7 +605,7 @@ static void hists__apply_filters(struct hists *hists, struct hist_entry *he)
hists__filter_entry_by_symbol(hists, he); hists__filter_entry_by_symbol(hists, he);
} }
void hists__collapse_resort(struct hists *hists) void hists__collapse_resort(struct hists *hists, struct ui_progress *prog)
{ {
struct rb_root *root; struct rb_root *root;
struct rb_node *next; struct rb_node *next;
...@@ -631,6 +632,8 @@ void hists__collapse_resort(struct hists *hists) ...@@ -631,6 +632,8 @@ void hists__collapse_resort(struct hists *hists)
*/ */
hists__apply_filters(hists, n); hists__apply_filters(hists, n);
} }
if (prog)
ui_progress__update(prog, 1);
} }
} }
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <pthread.h> #include <pthread.h>
#include "callchain.h" #include "callchain.h"
#include "header.h" #include "header.h"
#include "ui/progress.h"
extern struct callchain_param callchain_param; extern struct callchain_param callchain_param;
...@@ -108,7 +109,7 @@ struct hist_entry *__hists__add_mem_entry(struct hists *self, ...@@ -108,7 +109,7 @@ struct hist_entry *__hists__add_mem_entry(struct hists *self,
u64 weight); u64 weight);
void hists__output_resort(struct hists *self); void hists__output_resort(struct hists *self);
void hists__collapse_resort(struct hists *self); void hists__collapse_resort(struct hists *self, struct ui_progress *prog);
void hists__decay_entries(struct hists *hists, bool zap_user, bool zap_kernel); void hists__decay_entries(struct hists *hists, bool zap_user, bool zap_kernel);
void hists__output_recalc_col_len(struct hists *hists, int max_rows); void hists__output_recalc_col_len(struct hists *hists, int max_rows);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册