Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d7b76f09 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo
Browse files

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.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 82e0af87
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -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;

@@ -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;
		}
@@ -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;

@@ -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;
		}
+7 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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);
+22 −26
Original line number Diff line number Diff line
@@ -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)
{
@@ -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)
@@ -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 */
@@ -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);
@@ -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;
		}
@@ -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++;

@@ -994,36 +990,36 @@ do_annotate:
			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);
		}
	}