Skip to content

Commit

Permalink
perf hists: Move the dso and thread filters from hist_browser
Browse files Browse the repository at this point in the history
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.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Arnaldo Carvalho de Melo committed Oct 19, 2011
1 parent 82e0af8 commit d7b76f0
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 32 deletions.
10 changes: 6 additions & 4 deletions tools/perf/util/hist.c
Original file line number Diff line number Diff line change
Expand Up @@ -1087,7 +1087,7 @@ static void hists__remove_entry_filter(struct hists *hists, struct hist_entry *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;

Expand All @@ -1101,7 +1101,8 @@ void hists__filter_by_dso(struct hists *hists, const struct dso *dso)
if (symbol_conf.exclude_other && !h->parent)
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);
continue;
}
Expand All @@ -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;

Expand All @@ -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)) {
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);
continue;
}
Expand Down
9 changes: 7 additions & 2 deletions tools/perf/util/hist.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,17 @@ enum hist_column {
HISTC_NR_COLS, /* Last entry */
};

struct thread;
struct dso;

struct hists {
struct rb_root entries_in_array[2];
struct rb_root *entries_in;
struct rb_root entries;
struct rb_root entries_collapsed;
u64 nr_entries;
const struct thread *thread_filter;
const struct dso *dso_filter;
pthread_mutex_t lock;
struct events_stats stats;
u64 event_stream;
Expand Down Expand Up @@ -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__annotate(struct hist_entry *self, size_t privsize);

void hists__filter_by_dso(struct hists *self, const struct dso *dso);
void hists__filter_by_thread(struct hists *self, const struct thread *thread);
void hists__filter_by_dso(struct hists *hists);
void hists__filter_by_thread(struct hists *hists);

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);
Expand Down
48 changes: 22 additions & 26 deletions tools/perf/util/ui/browsers/hists.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,11 @@ struct hist_browser {
struct hists *hists;
struct hist_entry *he_selection;
struct map_symbol *selection;
const struct thread *thread_filter;
const struct dso *dso_filter;
bool has_symbols;
};

static int hists__browser_title(struct hists *self, char *bf, size_t size,
const char *ev_name, const struct dso *dso,
const struct thread *thread);
const char *ev_name);

static void hist_browser__refresh_dimensions(struct hist_browser *self)
{
Expand Down Expand Up @@ -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;

hist_browser__refresh_dimensions(self);
hists__browser_title(self->hists, title, sizeof(title), ev_name,
self->dso_filter, self->thread_filter);
hists__browser_title(self->hists, title, sizeof(title), ev_name);

if (ui_browser__show(&self->b, title,
"Press '?' for help on key bindings") < 0)
Expand All @@ -323,8 +319,7 @@ static int hist_browser__run(struct hist_browser *self, const char *ev_name,
timer(arg);
ui_browser__update_nr_entries(&self->b, self->hists->nr_entries);
hists__browser_title(self->hists, title, sizeof(title),
ev_name, self->dso_filter,
self->thread_filter);
ev_name);
ui_browser__show_title(&self->b, title);
continue;
case 'D': { /* Debug */
Expand Down Expand Up @@ -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,
const char *ev_name, const struct dso *dso,
const struct thread *thread)
const char *ev_name)
{
char unit;
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];

nr_events = convert_unit(nr_events, &unit);
Expand Down Expand Up @@ -917,9 +913,9 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
continue;
}
top = pstack__pop(fstack);
if (top == &browser->dso_filter)
if (top == &browser->hists->dso_filter)
goto zoom_out_dso;
if (top == &browser->thread_filter)
if (top == &browser->hists->thread_filter)
goto zoom_out_thread;
continue;
}
Expand Down Expand Up @@ -947,14 +943,14 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,

if (thread != NULL &&
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->pid) > 0)
zoom_thread = nr_options++;

if (dso != NULL &&
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)
zoom_dso = nr_options++;

Expand Down Expand Up @@ -994,36 +990,36 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
map__browse(browser->selection->map);
else if (choice == zoom_dso) {
zoom_dso:
if (browser->dso_filter) {
pstack__remove(fstack, &browser->dso_filter);
if (browser->hists->dso_filter) {
pstack__remove(fstack, &browser->hists->dso_filter);
zoom_out_dso:
ui_helpline__pop();
browser->dso_filter = NULL;
browser->hists->dso_filter = NULL;
} else {
if (dso == NULL)
continue;
ui_helpline__fpush("To zoom out press <- or -> + \"Zoom out of %s DSO\"",
dso->kernel ? "the Kernel" : dso->short_name);
browser->dso_filter = dso;
pstack__push(fstack, &browser->dso_filter);
browser->hists->dso_filter = dso;
pstack__push(fstack, &browser->hists->dso_filter);
}
hists__filter_by_dso(self, browser->dso_filter);
hists__filter_by_dso(self);
hist_browser__reset(browser);
} else if (choice == zoom_thread) {
zoom_thread:
if (browser->thread_filter) {
pstack__remove(fstack, &browser->thread_filter);
if (browser->hists->thread_filter) {
pstack__remove(fstack, &browser->hists->thread_filter);
zoom_out_thread:
ui_helpline__pop();
browser->thread_filter = NULL;
browser->hists->thread_filter = NULL;
} else {
ui_helpline__fpush("To zoom out press <- or -> + \"Zoom out of %s(%d) thread\"",
thread->comm_set ? thread->comm : "",
thread->pid);
browser->thread_filter = thread;
pstack__push(fstack, &browser->thread_filter);
browser->hists->thread_filter = thread;
pstack__push(fstack, &browser->hists->thread_filter);
}
hists__filter_by_thread(self, browser->thread_filter);
hists__filter_by_thread(self);
hist_browser__reset(browser);
}
}
Expand Down

0 comments on commit d7b76f0

Please sign in to comment.