mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 21:24:08 +08:00
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: Namhyung 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: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
4d3001fdfd
commit
c1fb5651bb
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
hists__apply_filters(hists, n);
|
hists__apply_filters(hists, n);
|
||||||
}
|
}
|
||||||
|
if (prog)
|
||||||
|
ui_progress__update(prog, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
|||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user