perf evlist: Move destruction of maps to evlist destructor

Instead of requiring tools to do an extra destructor call just before
calling perf_evlist__delete.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
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-0jd2ptzyikxb5wp7inzz2ah2@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 3e2be2da
...@@ -1556,10 +1556,8 @@ static int kvm_events_live(struct perf_kvm_stat *kvm, ...@@ -1556,10 +1556,8 @@ static int kvm_events_live(struct perf_kvm_stat *kvm,
if (kvm->session) if (kvm->session)
perf_session__delete(kvm->session); perf_session__delete(kvm->session);
kvm->session = NULL; kvm->session = NULL;
if (kvm->evlist) { if (kvm->evlist)
perf_evlist__delete_maps(kvm->evlist);
perf_evlist__delete(kvm->evlist); perf_evlist__delete(kvm->evlist);
}
return err; return err;
} }
......
...@@ -964,15 +964,13 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -964,15 +964,13 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
if (record_opts__config(&rec->opts)) { if (record_opts__config(&rec->opts)) {
err = -EINVAL; err = -EINVAL;
goto out_free_fd; goto out_symbol_exit;
} }
err = __cmd_record(&record, argc, argv); err = __cmd_record(&record, argc, argv);
perf_evlist__munmap(rec->evlist); perf_evlist__munmap(rec->evlist);
perf_evlist__close(rec->evlist); perf_evlist__close(rec->evlist);
out_free_fd:
perf_evlist__delete_maps(rec->evlist);
out_symbol_exit: out_symbol_exit:
symbol__exit(); symbol__exit();
return err; return err;
......
...@@ -1782,14 +1782,14 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -1782,14 +1782,14 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
if (interval && interval < 100) { if (interval && interval < 100) {
pr_err("print interval must be >= 100ms\n"); pr_err("print interval must be >= 100ms\n");
parse_options_usage(stat_usage, options, "I", 1); parse_options_usage(stat_usage, options, "I", 1);
goto out_free_maps; goto out;
} }
if (perf_evlist__alloc_stats(evsel_list, interval)) if (perf_evlist__alloc_stats(evsel_list, interval))
goto out_free_maps; goto out;
if (perf_stat_init_aggr_mode()) if (perf_stat_init_aggr_mode())
goto out_free_maps; goto out;
/* /*
* We dont want to block the signals - that would cause * We dont want to block the signals - that would cause
...@@ -1821,8 +1821,6 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -1821,8 +1821,6 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
print_stat(argc, argv); print_stat(argc, argv);
perf_evlist__free_stats(evsel_list); perf_evlist__free_stats(evsel_list);
out_free_maps:
perf_evlist__delete_maps(evsel_list);
out: out:
perf_evlist__delete(evsel_list); perf_evlist__delete(evsel_list);
return status; return status;
......
...@@ -1171,7 +1171,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -1171,7 +1171,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused)
if (!top.evlist->nr_entries && if (!top.evlist->nr_entries &&
perf_evlist__add_default(top.evlist) < 0) { perf_evlist__add_default(top.evlist) < 0) {
ui__error("Not enough memory for event selector list\n"); ui__error("Not enough memory for event selector list\n");
goto out_delete_maps; goto out_delete_evlist;
} }
symbol_conf.nr_events = top.evlist->nr_entries; symbol_conf.nr_events = top.evlist->nr_entries;
...@@ -1181,7 +1181,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -1181,7 +1181,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused)
if (record_opts__config(opts)) { if (record_opts__config(opts)) {
status = -EINVAL; status = -EINVAL;
goto out_delete_maps; goto out_delete_evlist;
} }
top.sym_evsel = perf_evlist__first(top.evlist); top.sym_evsel = perf_evlist__first(top.evlist);
...@@ -1206,8 +1206,6 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -1206,8 +1206,6 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused)
status = __cmd_top(&top); status = __cmd_top(&top);
out_delete_maps:
perf_evlist__delete_maps(top.evlist);
out_delete_evlist: out_delete_evlist:
perf_evlist__delete(top.evlist); perf_evlist__delete(top.evlist);
......
...@@ -1885,7 +1885,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv) ...@@ -1885,7 +1885,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
err = trace__symbols_init(trace, evlist); err = trace__symbols_init(trace, evlist);
if (err < 0) { if (err < 0) {
fprintf(trace->output, "Problems initializing symbol libraries!\n"); fprintf(trace->output, "Problems initializing symbol libraries!\n");
goto out_delete_maps; goto out_delete_evlist;
} }
perf_evlist__config(evlist, &trace->opts); perf_evlist__config(evlist, &trace->opts);
...@@ -1898,7 +1898,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv) ...@@ -1898,7 +1898,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
argv, false, NULL); argv, false, NULL);
if (err < 0) { if (err < 0) {
fprintf(trace->output, "Couldn't run the workload!\n"); fprintf(trace->output, "Couldn't run the workload!\n");
goto out_delete_maps; goto out_delete_evlist;
} }
} }
...@@ -1996,8 +1996,6 @@ static int trace__run(struct trace *trace, int argc, const char **argv) ...@@ -1996,8 +1996,6 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
perf_evlist__munmap(evlist); perf_evlist__munmap(evlist);
out_close_evlist: out_close_evlist:
perf_evlist__close(evlist); perf_evlist__close(evlist);
out_delete_maps:
perf_evlist__delete_maps(evlist);
out_delete_evlist: out_delete_evlist:
perf_evlist__delete(evlist); perf_evlist__delete(evlist);
out: out:
......
...@@ -543,11 +543,10 @@ static int do_test_code_reading(bool try_kcore) ...@@ -543,11 +543,10 @@ static int do_test_code_reading(bool try_kcore)
perf_evlist__munmap(evlist); perf_evlist__munmap(evlist);
perf_evlist__close(evlist); perf_evlist__close(evlist);
perf_evlist__delete(evlist); perf_evlist__delete(evlist);
} } else {
if (cpus)
cpu_map__delete(cpus); cpu_map__delete(cpus);
if (threads)
thread_map__delete(threads); thread_map__delete(threads);
}
machines__destroy_kernel_maps(&machines); machines__destroy_kernel_maps(&machines);
machine__delete_threads(machine); machine__delete_threads(machine);
machines__exit(&machines); machines__exit(&machines);
......
...@@ -145,11 +145,10 @@ int test__keep_tracking(void) ...@@ -145,11 +145,10 @@ int test__keep_tracking(void)
perf_evlist__munmap(evlist); perf_evlist__munmap(evlist);
perf_evlist__close(evlist); perf_evlist__close(evlist);
perf_evlist__delete(evlist); perf_evlist__delete(evlist);
} } else {
if (cpus)
cpu_map__delete(cpus); cpu_map__delete(cpus);
if (threads)
thread_map__delete(threads); thread_map__delete(threads);
}
return err; return err;
} }
...@@ -143,6 +143,8 @@ int test__basic_mmap(void) ...@@ -143,6 +143,8 @@ int test__basic_mmap(void)
perf_evsel__close_fd(evsels[i], 1, threads->nr); perf_evsel__close_fd(evsels[i], 1, threads->nr);
out_free_evlist: out_free_evlist:
perf_evlist__delete(evlist); perf_evlist__delete(evlist);
cpus = NULL;
threads = NULL;
out_free_cpus: out_free_cpus:
cpu_map__delete(cpus); cpu_map__delete(cpus);
out_free_threads: out_free_threads:
......
...@@ -48,7 +48,7 @@ int test__syscall_open_tp_fields(void) ...@@ -48,7 +48,7 @@ int test__syscall_open_tp_fields(void)
err = perf_evlist__open(evlist); err = perf_evlist__open(evlist);
if (err < 0) { if (err < 0) {
pr_debug("perf_evlist__open: %s\n", strerror(errno)); pr_debug("perf_evlist__open: %s\n", strerror(errno));
goto out_delete_maps; goto out_delete_evlist;
} }
err = perf_evlist__mmap(evlist, UINT_MAX, false); err = perf_evlist__mmap(evlist, UINT_MAX, false);
...@@ -114,8 +114,6 @@ int test__syscall_open_tp_fields(void) ...@@ -114,8 +114,6 @@ int test__syscall_open_tp_fields(void)
perf_evlist__munmap(evlist); perf_evlist__munmap(evlist);
out_close_evlist: out_close_evlist:
perf_evlist__close(evlist); perf_evlist__close(evlist);
out_delete_maps:
perf_evlist__delete_maps(evlist);
out_delete_evlist: out_delete_evlist:
perf_evlist__delete(evlist); perf_evlist__delete(evlist);
out: out:
......
...@@ -86,7 +86,7 @@ int test__PERF_RECORD(void) ...@@ -86,7 +86,7 @@ int test__PERF_RECORD(void)
err = perf_evlist__prepare_workload(evlist, &opts.target, argv, false, NULL); err = perf_evlist__prepare_workload(evlist, &opts.target, argv, false, NULL);
if (err < 0) { if (err < 0) {
pr_debug("Couldn't run the workload!\n"); pr_debug("Couldn't run the workload!\n");
goto out_delete_maps; goto out_delete_evlist;
} }
/* /*
...@@ -101,7 +101,7 @@ int test__PERF_RECORD(void) ...@@ -101,7 +101,7 @@ int test__PERF_RECORD(void)
err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask); err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask);
if (err < 0) { if (err < 0) {
pr_debug("sched__get_first_possible_cpu: %s\n", strerror(errno)); pr_debug("sched__get_first_possible_cpu: %s\n", strerror(errno));
goto out_delete_maps; goto out_delete_evlist;
} }
cpu = err; cpu = err;
...@@ -111,7 +111,7 @@ int test__PERF_RECORD(void) ...@@ -111,7 +111,7 @@ int test__PERF_RECORD(void)
*/ */
if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, &cpu_mask) < 0) { if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, &cpu_mask) < 0) {
pr_debug("sched_setaffinity: %s\n", strerror(errno)); pr_debug("sched_setaffinity: %s\n", strerror(errno));
goto out_delete_maps; goto out_delete_evlist;
} }
/* /*
...@@ -121,7 +121,7 @@ int test__PERF_RECORD(void) ...@@ -121,7 +121,7 @@ int test__PERF_RECORD(void)
err = perf_evlist__open(evlist); err = perf_evlist__open(evlist);
if (err < 0) { if (err < 0) {
pr_debug("perf_evlist__open: %s\n", strerror(errno)); pr_debug("perf_evlist__open: %s\n", strerror(errno));
goto out_delete_maps; goto out_delete_evlist;
} }
/* /*
...@@ -306,8 +306,6 @@ int test__PERF_RECORD(void) ...@@ -306,8 +306,6 @@ int test__PERF_RECORD(void)
perf_evlist__munmap(evlist); perf_evlist__munmap(evlist);
out_close_evlist: out_close_evlist:
perf_evlist__close(evlist); perf_evlist__close(evlist);
out_delete_maps:
perf_evlist__delete_maps(evlist);
out_delete_evlist: out_delete_evlist:
perf_evlist__delete(evlist); perf_evlist__delete(evlist);
out: out:
......
...@@ -170,10 +170,6 @@ int test__perf_time_to_tsc(void) ...@@ -170,10 +170,6 @@ int test__perf_time_to_tsc(void)
perf_evlist__close(evlist); perf_evlist__close(evlist);
perf_evlist__delete(evlist); perf_evlist__delete(evlist);
} }
if (cpus)
cpu_map__delete(cpus);
if (threads)
thread_map__delete(threads);
return err; return err;
} }
...@@ -45,7 +45,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id) ...@@ -45,7 +45,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
evsel = perf_evsel__new(&attr); evsel = perf_evsel__new(&attr);
if (evsel == NULL) { if (evsel == NULL) {
pr_debug("perf_evsel__new\n"); pr_debug("perf_evsel__new\n");
goto out_free_evlist; goto out_delete_evlist;
} }
perf_evlist__add(evlist, evsel); perf_evlist__add(evlist, evsel);
...@@ -54,7 +54,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id) ...@@ -54,7 +54,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
if (!evlist->cpus || !evlist->threads) { if (!evlist->cpus || !evlist->threads) {
err = -ENOMEM; err = -ENOMEM;
pr_debug("Not enough memory to create thread/cpu maps\n"); pr_debug("Not enough memory to create thread/cpu maps\n");
goto out_delete_maps; goto out_delete_evlist;
} }
if (perf_evlist__open(evlist)) { if (perf_evlist__open(evlist)) {
...@@ -63,7 +63,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id) ...@@ -63,7 +63,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
err = -errno; err = -errno;
pr_debug("Couldn't open evlist: %s\nHint: check %s, using %" PRIu64 " in this test.\n", pr_debug("Couldn't open evlist: %s\nHint: check %s, using %" PRIu64 " in this test.\n",
strerror(errno), knob, (u64)attr.sample_freq); strerror(errno), knob, (u64)attr.sample_freq);
goto out_delete_maps; goto out_delete_evlist;
} }
err = perf_evlist__mmap(evlist, 128, true); err = perf_evlist__mmap(evlist, 128, true);
...@@ -109,9 +109,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id) ...@@ -109,9 +109,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
perf_evlist__munmap(evlist); perf_evlist__munmap(evlist);
out_close_evlist: out_close_evlist:
perf_evlist__close(evlist); perf_evlist__close(evlist);
out_delete_maps: out_delete_evlist:
perf_evlist__delete_maps(evlist);
out_free_evlist:
perf_evlist__delete(evlist); perf_evlist__delete(evlist);
return err; return err;
} }
......
...@@ -62,14 +62,14 @@ int test__task_exit(void) ...@@ -62,14 +62,14 @@ int test__task_exit(void)
if (!evlist->cpus || !evlist->threads) { if (!evlist->cpus || !evlist->threads) {
err = -ENOMEM; err = -ENOMEM;
pr_debug("Not enough memory to create thread/cpu maps\n"); pr_debug("Not enough memory to create thread/cpu maps\n");
goto out_delete_maps; goto out_delete_evlist;
} }
err = perf_evlist__prepare_workload(evlist, &target, argv, false, err = perf_evlist__prepare_workload(evlist, &target, argv, false,
workload_exec_failed_signal); workload_exec_failed_signal);
if (err < 0) { if (err < 0) {
pr_debug("Couldn't run the workload!\n"); pr_debug("Couldn't run the workload!\n");
goto out_delete_maps; goto out_delete_evlist;
} }
evsel = perf_evlist__first(evlist); evsel = perf_evlist__first(evlist);
...@@ -83,7 +83,7 @@ int test__task_exit(void) ...@@ -83,7 +83,7 @@ int test__task_exit(void)
err = perf_evlist__open(evlist); err = perf_evlist__open(evlist);
if (err < 0) { if (err < 0) {
pr_debug("Couldn't open the evlist: %s\n", strerror(-err)); pr_debug("Couldn't open the evlist: %s\n", strerror(-err));
goto out_delete_maps; goto out_delete_evlist;
} }
if (perf_evlist__mmap(evlist, 128, true) < 0) { if (perf_evlist__mmap(evlist, 128, true) < 0) {
...@@ -115,8 +115,7 @@ int test__task_exit(void) ...@@ -115,8 +115,7 @@ int test__task_exit(void)
perf_evlist__munmap(evlist); perf_evlist__munmap(evlist);
out_close_evlist: out_close_evlist:
perf_evlist__close(evlist); perf_evlist__close(evlist);
out_delete_maps: out_delete_evlist:
perf_evlist__delete_maps(evlist);
perf_evlist__delete(evlist); perf_evlist__delete(evlist);
return err; return err;
} }
...@@ -107,6 +107,10 @@ void perf_evlist__exit(struct perf_evlist *evlist) ...@@ -107,6 +107,10 @@ void perf_evlist__exit(struct perf_evlist *evlist)
void perf_evlist__delete(struct perf_evlist *evlist) void perf_evlist__delete(struct perf_evlist *evlist)
{ {
cpu_map__delete(evlist->cpus);
thread_map__delete(evlist->threads);
evlist->cpus = NULL;
evlist->threads = NULL;
perf_evlist__purge(evlist); perf_evlist__purge(evlist);
perf_evlist__exit(evlist); perf_evlist__exit(evlist);
free(evlist); free(evlist);
...@@ -833,14 +837,6 @@ int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target) ...@@ -833,14 +837,6 @@ int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target)
return -1; return -1;
} }
void perf_evlist__delete_maps(struct perf_evlist *evlist)
{
cpu_map__delete(evlist->cpus);
thread_map__delete(evlist->threads);
evlist->cpus = NULL;
evlist->threads = NULL;
}
int perf_evlist__apply_filters(struct perf_evlist *evlist) int perf_evlist__apply_filters(struct perf_evlist *evlist)
{ {
struct perf_evsel *evsel; struct perf_evsel *evsel;
......
...@@ -135,7 +135,6 @@ static inline void perf_evlist__set_maps(struct perf_evlist *evlist, ...@@ -135,7 +135,6 @@ static inline void perf_evlist__set_maps(struct perf_evlist *evlist,
} }
int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target); int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target);
void perf_evlist__delete_maps(struct perf_evlist *evlist);
int perf_evlist__apply_filters(struct perf_evlist *evlist); int perf_evlist__apply_filters(struct perf_evlist *evlist);
void __perf_evlist__set_leader(struct list_head *list); void __perf_evlist__set_leader(struct list_head *list);
......
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