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.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent ee29be62
...@@ -778,16 +778,10 @@ int cmd_record(int argc, const char **argv, const char *prefix __used) ...@@ -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)
......
...@@ -1240,8 +1240,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) ...@@ -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;
} }
......
...@@ -1034,9 +1034,7 @@ parse_callchain_opt(const struct option *opt, const char *arg, int unset) ...@@ -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) ...@@ -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) ...@@ -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;
......
...@@ -275,7 +275,7 @@ void perf_evlist__enable(struct perf_evlist *evlist) ...@@ -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) ...@@ -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)
......
...@@ -72,7 +72,6 @@ int perf_evlist__set_tracepoints_handlers(struct perf_evlist *evlist, ...@@ -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, ...@@ -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);
......
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