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

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

perf evlist: Always do automatic allocation of pollfd and mmap structures

At first tools were required to do that, but while writing the python
bindings to simplify the API I made them auto-allocate when needed.

This just makes record, stat and top use that auto allocation,
simplifying them a bit.

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-iokhcvkzzijr3keioubx8hlq@git.kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent ee29be62
Loading
Loading
Loading
Loading
+0 −6
Original line number Original line Diff line number Diff line
@@ -778,16 +778,10 @@ int cmd_record(int argc, const char **argv, const char *prefix __used)
		usage_with_options(record_usage, record_options);
		usage_with_options(record_usage, record_options);


	list_for_each_entry(pos, &evsel_list->entries, node) {
	list_for_each_entry(pos, &evsel_list->entries, node) {
		if (perf_evsel__alloc_fd(pos, evsel_list->cpus->nr,
					 evsel_list->threads->nr) < 0)
			goto out_free_fd;
		if (perf_header__push_event(pos->attr.config, event_name(pos)))
		if (perf_header__push_event(pos->attr.config, event_name(pos)))
			goto out_free_fd;
			goto out_free_fd;
	}
	}


	if (perf_evlist__alloc_pollfd(evsel_list) < 0)
		goto out_free_fd;

	if (rec->opts.user_interval != ULLONG_MAX)
	if (rec->opts.user_interval != ULLONG_MAX)
		rec->opts.default_interval = rec->opts.user_interval;
		rec->opts.default_interval = rec->opts.user_interval;
	if (rec->opts.user_freq != UINT_MAX)
	if (rec->opts.user_freq != UINT_MAX)
+1 −2
Original line number Original line Diff line number Diff line
@@ -1240,8 +1240,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used)


	list_for_each_entry(pos, &evsel_list->entries, node) {
	list_for_each_entry(pos, &evsel_list->entries, node) {
		if (perf_evsel__alloc_stat_priv(pos) < 0 ||
		if (perf_evsel__alloc_stat_priv(pos) < 0 ||
		    perf_evsel__alloc_counts(pos, evsel_list->cpus->nr) < 0 ||
		    perf_evsel__alloc_counts(pos, evsel_list->cpus->nr) < 0)
		    perf_evsel__alloc_fd(pos, evsel_list->cpus->nr, evsel_list->threads->nr) < 0)
			goto out_free_fd;
			goto out_free_fd;
	}
	}


+4 −15
Original line number Original line Diff line number Diff line
@@ -1034,9 +1034,7 @@ parse_callchain_opt(const struct option *opt, const char *arg, int unset)
		symbol_conf.use_callchain = false;
		symbol_conf.use_callchain = false;


		return 0;
		return 0;
	}
	} else

	else
		return -1;
		return -1;


	/* get the min percentage */
	/* get the min percentage */
@@ -1225,22 +1223,13 @@ int cmd_top(int argc, const char **argv, const char *prefix __used)
	}
	}


	list_for_each_entry(pos, &top.evlist->entries, node) {
	list_for_each_entry(pos, &top.evlist->entries, node) {
		if (perf_evsel__alloc_fd(pos, top.evlist->cpus->nr,
					 top.evlist->threads->nr) < 0)
			goto out_free_fd;
		/*
		/*
		 * Fill in the ones not specifically initialized via -c:
		 * Fill in the ones not specifically initialized via -c:
		 */
		 */
		if (pos->attr.sample_period)
		if (!pos->attr.sample_period)
			continue;

			pos->attr.sample_period = top.default_interval;
			pos->attr.sample_period = top.default_interval;
	}
	}


	if (perf_evlist__alloc_pollfd(top.evlist) < 0 ||
	    perf_evlist__alloc_mmap(top.evlist) < 0)
		goto out_free_fd;

	top.sym_evsel = list_entry(top.evlist->entries.next, struct perf_evsel, node);
	top.sym_evsel = list_entry(top.evlist->entries.next, struct perf_evsel, node);


	symbol_conf.priv_size = sizeof(struct annotation);
	symbol_conf.priv_size = sizeof(struct annotation);
@@ -1270,7 +1259,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __used)
	}
	}


	status = __cmd_top(&top);
	status = __cmd_top(&top);
out_free_fd:

	perf_evlist__delete(top.evlist);
	perf_evlist__delete(top.evlist);


	return status;
	return status;
+2 −2
Original line number Original line Diff line number Diff line
@@ -275,7 +275,7 @@ void perf_evlist__enable(struct perf_evlist *evlist)
	}
	}
}
}


int perf_evlist__alloc_pollfd(struct perf_evlist *evlist)
static int perf_evlist__alloc_pollfd(struct perf_evlist *evlist)
{
{
	int nfds = evlist->cpus->nr * evlist->threads->nr * evlist->nr_entries;
	int nfds = evlist->cpus->nr * evlist->threads->nr * evlist->nr_entries;
	evlist->pollfd = malloc(sizeof(struct pollfd) * nfds);
	evlist->pollfd = malloc(sizeof(struct pollfd) * nfds);
@@ -431,7 +431,7 @@ void perf_evlist__munmap(struct perf_evlist *evlist)
	evlist->mmap = NULL;
	evlist->mmap = NULL;
}
}


int perf_evlist__alloc_mmap(struct perf_evlist *evlist)
static int perf_evlist__alloc_mmap(struct perf_evlist *evlist)
{
{
	evlist->nr_mmaps = evlist->cpus->nr;
	evlist->nr_mmaps = evlist->cpus->nr;
	if (evlist->cpus->map[0] == -1)
	if (evlist->cpus->map[0] == -1)
+0 −2
Original line number Original line Diff line number Diff line
@@ -72,7 +72,6 @@ int perf_evlist__set_tracepoints_handlers(struct perf_evlist *evlist,
void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel,
void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel,
			 int cpu, int thread, u64 id);
			 int cpu, int thread, u64 id);


int perf_evlist__alloc_pollfd(struct perf_evlist *evlist);
void perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd);
void perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd);


struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id);
struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id);
@@ -89,7 +88,6 @@ int perf_evlist__prepare_workload(struct perf_evlist *evlist,
				  const char *argv[]);
				  const char *argv[]);
int perf_evlist__start_workload(struct perf_evlist *evlist);
int perf_evlist__start_workload(struct perf_evlist *evlist);


int perf_evlist__alloc_mmap(struct perf_evlist *evlist);
int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages,
int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages,
		      bool overwrite);
		      bool overwrite);
void perf_evlist__munmap(struct perf_evlist *evlist);
void perf_evlist__munmap(struct perf_evlist *evlist);