perf hists: Move the dso and thread filters from hist_browser

Since with dynamic addition of new hist entries we need to apply those
filters as we merge new batches of hist_entry instances, for instance in
perf top.

Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-zjhhf8kh9w1buty9p10od6rz@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 82e0af87
...@@ -1087,7 +1087,7 @@ static void hists__remove_entry_filter(struct hists *hists, struct hist_entry *h ...@@ -1087,7 +1087,7 @@ static void hists__remove_entry_filter(struct hists *hists, struct hist_entry *h
hists__calc_col_len(hists, h); hists__calc_col_len(hists, h);
} }
void hists__filter_by_dso(struct hists *hists, const struct dso *dso) void hists__filter_by_dso(struct hists *hists)
{ {
struct rb_node *nd; struct rb_node *nd;
...@@ -1101,7 +1101,8 @@ void hists__filter_by_dso(struct hists *hists, const struct dso *dso) ...@@ -1101,7 +1101,8 @@ void hists__filter_by_dso(struct hists *hists, const struct dso *dso)
if (symbol_conf.exclude_other && !h->parent) if (symbol_conf.exclude_other && !h->parent)
continue; continue;
if (dso != NULL && (h->ms.map == NULL || h->ms.map->dso != dso)) { if (hists->dso_filter != NULL &&
(h->ms.map == NULL || h->ms.map->dso != hists->dso_filter)) {
h->filtered |= (1 << HIST_FILTER__DSO); h->filtered |= (1 << HIST_FILTER__DSO);
continue; continue;
} }
...@@ -1110,7 +1111,7 @@ void hists__filter_by_dso(struct hists *hists, const struct dso *dso) ...@@ -1110,7 +1111,7 @@ void hists__filter_by_dso(struct hists *hists, const struct dso *dso)
} }
} }
void hists__filter_by_thread(struct hists *hists, const struct thread *thread) void hists__filter_by_thread(struct hists *hists)
{ {
struct rb_node *nd; struct rb_node *nd;
...@@ -1121,7 +1122,8 @@ void hists__filter_by_thread(struct hists *hists, const struct thread *thread) ...@@ -1121,7 +1122,8 @@ void hists__filter_by_thread(struct hists *hists, const struct thread *thread)
for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) { for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) {
struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node); struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
if (thread != NULL && h->thread != thread) { if (hists->thread_filter != NULL &&
h->thread != hists->thread_filter) {
h->filtered |= (1 << HIST_FILTER__THREAD); h->filtered |= (1 << HIST_FILTER__THREAD);
continue; continue;
} }
......
...@@ -43,12 +43,17 @@ enum hist_column { ...@@ -43,12 +43,17 @@ enum hist_column {
HISTC_NR_COLS, /* Last entry */ HISTC_NR_COLS, /* Last entry */
}; };
struct thread;
struct dso;
struct hists { struct hists {
struct rb_root entries_in_array[2]; struct rb_root entries_in_array[2];
struct rb_root *entries_in; struct rb_root *entries_in;
struct rb_root entries; struct rb_root entries;
struct rb_root entries_collapsed; struct rb_root entries_collapsed;
u64 nr_entries; u64 nr_entries;
const struct thread *thread_filter;
const struct dso *dso_filter;
pthread_mutex_t lock; pthread_mutex_t lock;
struct events_stats stats; struct events_stats stats;
u64 event_stream; u64 event_stream;
...@@ -91,8 +96,8 @@ size_t hists__fprintf(struct hists *self, struct hists *pair, ...@@ -91,8 +96,8 @@ size_t hists__fprintf(struct hists *self, struct hists *pair,
int hist_entry__inc_addr_samples(struct hist_entry *self, int evidx, u64 addr); int hist_entry__inc_addr_samples(struct hist_entry *self, int evidx, u64 addr);
int hist_entry__annotate(struct hist_entry *self, size_t privsize); int hist_entry__annotate(struct hist_entry *self, size_t privsize);
void hists__filter_by_dso(struct hists *self, const struct dso *dso); void hists__filter_by_dso(struct hists *hists);
void hists__filter_by_thread(struct hists *self, const struct thread *thread); void hists__filter_by_thread(struct hists *hists);
u16 hists__col_len(struct hists *self, enum hist_column col); u16 hists__col_len(struct hists *self, enum hist_column col);
void hists__set_col_len(struct hists *self, enum hist_column col, u16 len); void hists__set_col_len(struct hists *self, enum hist_column col, u16 len);
......
...@@ -24,14 +24,11 @@ struct hist_browser { ...@@ -24,14 +24,11 @@ struct hist_browser {
struct hists *hists; struct hists *hists;
struct hist_entry *he_selection; struct hist_entry *he_selection;
struct map_symbol *selection; struct map_symbol *selection;
const struct thread *thread_filter;
const struct dso *dso_filter;
bool has_symbols; bool has_symbols;
}; };
static int hists__browser_title(struct hists *self, char *bf, size_t size, static int hists__browser_title(struct hists *self, char *bf, size_t size,
const char *ev_name, const struct dso *dso, const char *ev_name);
const struct thread *thread);
static void hist_browser__refresh_dimensions(struct hist_browser *self) static void hist_browser__refresh_dimensions(struct hist_browser *self)
{ {
...@@ -307,8 +304,7 @@ static int hist_browser__run(struct hist_browser *self, const char *ev_name, ...@@ -307,8 +304,7 @@ static int hist_browser__run(struct hist_browser *self, const char *ev_name,
self->b.nr_entries = self->hists->nr_entries; self->b.nr_entries = self->hists->nr_entries;
hist_browser__refresh_dimensions(self); hist_browser__refresh_dimensions(self);
hists__browser_title(self->hists, title, sizeof(title), ev_name, hists__browser_title(self->hists, title, sizeof(title), ev_name);
self->dso_filter, self->thread_filter);
if (ui_browser__show(&self->b, title, if (ui_browser__show(&self->b, title,
"Press '?' for help on key bindings") < 0) "Press '?' for help on key bindings") < 0)
...@@ -323,8 +319,7 @@ static int hist_browser__run(struct hist_browser *self, const char *ev_name, ...@@ -323,8 +319,7 @@ static int hist_browser__run(struct hist_browser *self, const char *ev_name,
timer(arg); timer(arg);
ui_browser__update_nr_entries(&self->b, self->hists->nr_entries); ui_browser__update_nr_entries(&self->b, self->hists->nr_entries);
hists__browser_title(self->hists, title, sizeof(title), hists__browser_title(self->hists, title, sizeof(title),
ev_name, self->dso_filter, ev_name);
self->thread_filter);
ui_browser__show_title(&self->b, title); ui_browser__show_title(&self->b, title);
continue; continue;
case 'D': { /* Debug */ case 'D': { /* Debug */
...@@ -809,11 +804,12 @@ static struct thread *hist_browser__selected_thread(struct hist_browser *self) ...@@ -809,11 +804,12 @@ static struct thread *hist_browser__selected_thread(struct hist_browser *self)
} }
static int hists__browser_title(struct hists *self, char *bf, size_t size, static int hists__browser_title(struct hists *self, char *bf, size_t size,
const char *ev_name, const struct dso *dso, const char *ev_name)
const struct thread *thread)
{ {
char unit; char unit;
int printed; int printed;
const struct dso *dso = self->dso_filter;
const struct thread *thread = self->thread_filter;
unsigned long nr_events = self->stats.nr_events[PERF_RECORD_SAMPLE]; unsigned long nr_events = self->stats.nr_events[PERF_RECORD_SAMPLE];
nr_events = convert_unit(nr_events, &unit); nr_events = convert_unit(nr_events, &unit);
...@@ -917,9 +913,9 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, ...@@ -917,9 +913,9 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
continue; continue;
} }
top = pstack__pop(fstack); top = pstack__pop(fstack);
if (top == &browser->dso_filter) if (top == &browser->hists->dso_filter)
goto zoom_out_dso; goto zoom_out_dso;
if (top == &browser->thread_filter) if (top == &browser->hists->thread_filter)
goto zoom_out_thread; goto zoom_out_thread;
continue; continue;
} }
...@@ -947,14 +943,14 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, ...@@ -947,14 +943,14 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
if (thread != NULL && if (thread != NULL &&
asprintf(&options[nr_options], "Zoom %s %s(%d) thread", asprintf(&options[nr_options], "Zoom %s %s(%d) thread",
(browser->thread_filter ? "out of" : "into"), (browser->hists->thread_filter ? "out of" : "into"),
(thread->comm_set ? thread->comm : ""), (thread->comm_set ? thread->comm : ""),
thread->pid) > 0) thread->pid) > 0)
zoom_thread = nr_options++; zoom_thread = nr_options++;
if (dso != NULL && if (dso != NULL &&
asprintf(&options[nr_options], "Zoom %s %s DSO", asprintf(&options[nr_options], "Zoom %s %s DSO",
(browser->dso_filter ? "out of" : "into"), (browser->hists->dso_filter ? "out of" : "into"),
(dso->kernel ? "the Kernel" : dso->short_name)) > 0) (dso->kernel ? "the Kernel" : dso->short_name)) > 0)
zoom_dso = nr_options++; zoom_dso = nr_options++;
...@@ -994,36 +990,36 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, ...@@ -994,36 +990,36 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
map__browse(browser->selection->map); map__browse(browser->selection->map);
else if (choice == zoom_dso) { else if (choice == zoom_dso) {
zoom_dso: zoom_dso:
if (browser->dso_filter) { if (browser->hists->dso_filter) {
pstack__remove(fstack, &browser->dso_filter); pstack__remove(fstack, &browser->hists->dso_filter);
zoom_out_dso: zoom_out_dso:
ui_helpline__pop(); ui_helpline__pop();
browser->dso_filter = NULL; browser->hists->dso_filter = NULL;
} else { } else {
if (dso == NULL) if (dso == NULL)
continue; continue;
ui_helpline__fpush("To zoom out press <- or -> + \"Zoom out of %s DSO\"", ui_helpline__fpush("To zoom out press <- or -> + \"Zoom out of %s DSO\"",
dso->kernel ? "the Kernel" : dso->short_name); dso->kernel ? "the Kernel" : dso->short_name);
browser->dso_filter = dso; browser->hists->dso_filter = dso;
pstack__push(fstack, &browser->dso_filter); pstack__push(fstack, &browser->hists->dso_filter);
} }
hists__filter_by_dso(self, browser->dso_filter); hists__filter_by_dso(self);
hist_browser__reset(browser); hist_browser__reset(browser);
} else if (choice == zoom_thread) { } else if (choice == zoom_thread) {
zoom_thread: zoom_thread:
if (browser->thread_filter) { if (browser->hists->thread_filter) {
pstack__remove(fstack, &browser->thread_filter); pstack__remove(fstack, &browser->hists->thread_filter);
zoom_out_thread: zoom_out_thread:
ui_helpline__pop(); ui_helpline__pop();
browser->thread_filter = NULL; browser->hists->thread_filter = NULL;
} else { } else {
ui_helpline__fpush("To zoom out press <- or -> + \"Zoom out of %s(%d) thread\"", ui_helpline__fpush("To zoom out press <- or -> + \"Zoom out of %s(%d) thread\"",
thread->comm_set ? thread->comm : "", thread->comm_set ? thread->comm : "",
thread->pid); thread->pid);
browser->thread_filter = thread; browser->hists->thread_filter = thread;
pstack__push(fstack, &browser->thread_filter); pstack__push(fstack, &browser->hists->thread_filter);
} }
hists__filter_by_thread(self, browser->thread_filter); hists__filter_by_thread(self);
hist_browser__reset(browser); hist_browser__reset(browser);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment