From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751986AbbE1CuV (ORCPT ); Wed, 27 May 2015 22:50:21 -0400 Received: from LGEMRELSE7Q.lge.com ([156.147.1.151]:37945 "EHLO lgemrelse7q.lge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751630AbbE1CuN (ORCPT ); Wed, 27 May 2015 22:50:13 -0400 X-Original-SENDERIP: 10.177.220.203 X-Original-MAILFROM: namhyung@kernel.org From: Namhyung Kim To: Arnaldo Carvalho de Melo Cc: Ingo Molnar , Peter Zijlstra , Jiri Olsa , LKML , David Ahern Subject: [PATCH 1/2] perf tools: Introduce machines__new/delete() Date: Thu, 28 May 2015 11:39:03 +0900 Message-Id: <1432780744-8777-2-git-send-email-namhyung@kernel.org> X-Mailer: git-send-email 2.4.1 In-Reply-To: <1432780744-8777-1-git-send-email-namhyung@kernel.org> References: <20150519235813.GB22713@sejong> <1432780744-8777-1-git-send-email-namhyung@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Create and maintain struct machines in struct perf_tool and pass it to struct perf_session. This is a preparation of sharing machines among sessions in case of multi-thread report. Suggested-by: Arnaldo Carvalho de Melo Signed-off-by: Namhyung Kim --- tools/perf/builtin-annotate.c | 5 +++++ tools/perf/builtin-buildid-cache.c | 14 ++++++++++++-- tools/perf/builtin-buildid-list.c | 16 +++++++++++++--- tools/perf/builtin-diff.c | 16 ++++++++++++++-- tools/perf/builtin-evlist.c | 18 +++++++++++++++--- tools/perf/builtin-inject.c | 5 +++++ tools/perf/builtin-kmem.c | 4 ++++ tools/perf/builtin-kvm.c | 12 ++++++++++++ tools/perf/builtin-lock.c | 7 ++++++- tools/perf/builtin-mem.c | 12 +++++++++--- tools/perf/builtin-record.c | 8 +++++++- tools/perf/builtin-report.c | 9 ++++++++- tools/perf/builtin-sched.c | 8 +++++++- tools/perf/builtin-script.c | 32 ++++++++++++++++++++++++-------- tools/perf/builtin-timechart.c | 12 +++++++++--- tools/perf/builtin-top.c | 15 ++++++++++++--- tools/perf/builtin-trace.c | 8 +++++++- tools/perf/util/data-convert-bt.c | 8 +++++++- tools/perf/util/machine.c | 15 +++++++++++++++ tools/perf/util/machine.h | 3 +++ tools/perf/util/tool.h | 2 ++ 21 files changed, 196 insertions(+), 33 deletions(-) diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index 761f902473b7..e14a8a4d2f8d 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c @@ -345,6 +345,10 @@ int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused) setup_browser(true); + annotate.tool.machines = machines__new(); + if (annotate.tool.machines == NULL) + return -1; + annotate.session = perf_session__new(&file, false, &annotate.tool); if (annotate.session == NULL) return -1; @@ -384,6 +388,7 @@ int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused) * up we'll get here. * * perf_session__delete(session); + * machines__delete(annotate.tool.machines); */ return ret; } diff --git a/tools/perf/builtin-buildid-cache.c b/tools/perf/builtin-buildid-cache.c index d47a0cdc71c9..ff3eac1830fc 100644 --- a/tools/perf/builtin-buildid-cache.c +++ b/tools/perf/builtin-buildid-cache.c @@ -317,6 +317,9 @@ int cmd_buildid_cache(int argc, const char **argv, .mode = PERF_DATA_MODE_READ, }; struct perf_session *session = NULL; + struct perf_tool tool = { + .machines = NULL, + }; const struct option buildid_cache_options[] = { OPT_STRING('a', "add", &add_name_list_str, @@ -352,9 +355,14 @@ int cmd_buildid_cache(int argc, const char **argv, file.path = missing_filename; file.force = force; - session = perf_session__new(&file, false, NULL); - if (session == NULL) + ret = -1; + + tool.machines = machines__new(); + if (tool.machines == NULL) return -1; + session = perf_session__new(&file, false, &tool); + if (session == NULL) + goto out; } if (symbol__init(session ? &session->header.env : NULL) < 0) @@ -443,6 +451,8 @@ int cmd_buildid_cache(int argc, const char **argv, out: if (session) perf_session__delete(session); + if (tool.machines) + machines__delete(tool.machines); return ret; } diff --git a/tools/perf/builtin-buildid-list.c b/tools/perf/builtin-buildid-list.c index 9fe93c8d4fcf..2ab7d20a30a4 100644 --- a/tools/perf/builtin-buildid-list.c +++ b/tools/perf/builtin-buildid-list.c @@ -58,6 +58,8 @@ static int perf_session__list_build_ids(bool force, bool with_hits) .mode = PERF_DATA_MODE_READ, .force = force, }; + struct perf_tool *tool = &build_id__mark_dso_hit_ops; + int ret = -1; symbol__elf_init(); /* @@ -66,10 +68,14 @@ static int perf_session__list_build_ids(bool force, bool with_hits) if (filename__fprintf_build_id(input_name, stdout)) goto out; - session = perf_session__new(&file, false, &build_id__mark_dso_hit_ops); - if (session == NULL) + tool->machines = machines__new(); + if (tool->machines == NULL) return -1; + session = perf_session__new(&file, false, tool); + if (session == NULL) + goto out_delete; + /* * We take all buildids when the file contains AUX area tracing data * because we do not decode the trace because it would take too long. @@ -86,9 +92,13 @@ static int perf_session__list_build_ids(bool force, bool with_hits) perf_session__process_events(session); perf_session__fprintf_dsos_buildid(session, stdout, dso__skip_buildid, with_hits); + ret = 0; + perf_session__delete(session); +out_delete: + machines__delete(tool->machines); out: - return 0; + return ret; } int cmd_buildid_list(int argc, const char **argv, diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c index 0fe54a633a5e..a4431f096697 100644 --- a/tools/perf/builtin-diff.c +++ b/tools/perf/builtin-diff.c @@ -743,10 +743,17 @@ static int __cmd_diff(void) int ret = -EINVAL, i; data__for_each_file(i, d) { + ret = -ENOMEM; + + tool.machines = machines__new(); + if (tool.machines == NULL) { + pr_err("Failed to allocate machines\n"); + goto out_delete; + } + d->session = perf_session__new(&d->file, false, &tool); if (!d->session) { pr_err("Failed to open %s\n", d->file.path); - ret = -1; goto out_delete; } @@ -763,8 +770,13 @@ static int __cmd_diff(void) out_delete: data__for_each_file(i, d) { - if (d->session) + if (d->session) { + struct machines *machines = &d->session->machines; + perf_session__delete(d->session); + if (machines) + machines__delete(machines); + } data__free(d); } diff --git a/tools/perf/builtin-evlist.c b/tools/perf/builtin-evlist.c index 695ec5a50cf2..d742f987fde2 100644 --- a/tools/perf/builtin-evlist.c +++ b/tools/perf/builtin-evlist.c @@ -26,16 +26,28 @@ static int __cmd_evlist(const char *file_name, struct perf_attr_details *details .mode = PERF_DATA_MODE_READ, .force = details->force, }; + struct perf_tool tool = { + .machines = NULL, + }; + int ret = -1; - session = perf_session__new(&file, 0, NULL); - if (session == NULL) + tool.machines = machines__new(); + if (tool.machines == NULL) return -1; + session = perf_session__new(&file, 0, &tool); + if (session == NULL) + goto out; + evlist__for_each(session->evlist, pos) perf_evsel__fprintf(pos, details, stdout); + ret = 0; + perf_session__delete(session); - return 0; +out: + machines__delete(tool.machines); + return ret; } int cmd_evlist(int argc, const char **argv, const char *prefix __maybe_unused) diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index 52ec66b23607..4dc8164b4927 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c @@ -625,6 +625,10 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused) inject.tool.ordered_events = inject.sched_stat; + inject.tool.machines = machines__new(); + if (inject.tool.machines == NULL) + return -1; + file.path = inject.input_name; inject.session = perf_session__new(&file, true, &inject.tool); if (inject.session == NULL) @@ -636,6 +640,7 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused) ret = __cmd_inject(&inject); perf_session__delete(inject.session); + machines__delete(inject.tool.machines); return ret; } diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index 254614b10c4a..979a032fe85f 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c @@ -1908,6 +1908,9 @@ int cmd_kmem(int argc, const char **argv, const char *prefix __maybe_unused) file.path = input_name; + perf_kmem.machines = machines__new(); + if (perf_kmem.machines == NULL) + return -1; kmem_session = session = perf_session__new(&file, false, &perf_kmem); if (session == NULL) return -1; @@ -1963,6 +1966,7 @@ int cmd_kmem(int argc, const char **argv, const char *prefix __maybe_unused) out_delete: perf_session__delete(session); + machines__delete(perf_kmem.machines); return ret; } diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 15fecd3dc5d8..ca8836392af2 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -1053,6 +1053,10 @@ static int read_events(struct perf_kvm_stat *kvm) }; kvm->tool = eops; + kvm->tool.machines = machines__new(); + if (kvm->tool.machines == NULL) + return -1; + kvm->session = perf_session__new(&file, false, &kvm->tool); if (!kvm->session) { pr_err("Initializing perf session failed\n"); @@ -1381,6 +1385,12 @@ static int kvm_events_live(struct perf_kvm_stat *kvm, if (perf_evlist__create_maps(kvm->evlist, &kvm->opts.target) < 0) usage_with_options(live_usage, live_options); + kvm->tool.machines = machines__new(); + if (kvm->tool.machines == NULL) { + err = -1; + goto out; + } + /* * perf session */ @@ -1406,6 +1416,8 @@ static int kvm_events_live(struct perf_kvm_stat *kvm, if (kvm->session) perf_session__delete(kvm->session); kvm->session = NULL; + if (kvm->tool.machines) + machines__delete(kvm->tool.machines); if (kvm->evlist) perf_evlist__delete(kvm->evlist); diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c index de16aaed516e..aa0011f5c0aa 100644 --- a/tools/perf/builtin-lock.c +++ b/tools/perf/builtin-lock.c @@ -866,10 +866,13 @@ static int __cmd_report(bool display_info) .force = force, }; + eops.machines = machines__new(); + if (eops.machines == NULL) + return -1; session = perf_session__new(&file, false, &eops); if (!session) { pr_err("Initializing perf session failed\n"); - return -1; + goto out_delete_machine; } symbol__init(&session->header.env); @@ -899,6 +902,8 @@ static int __cmd_report(bool display_info) out_delete: perf_session__delete(session); +out_delete_machine: + machines__delete(eops.machines); return err; } diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c index da2ec06f0742..3399907a7d8d 100644 --- a/tools/perf/builtin-mem.c +++ b/tools/perf/builtin-mem.c @@ -126,12 +126,16 @@ static int report_raw_events(struct perf_mem *mem) }; int err = -EINVAL; int ret; - struct perf_session *session = perf_session__new(&file, false, - &mem->tool); + struct perf_session *session; - if (session == NULL) + mem->tool.machines = machines__new(); + if (mem->tool.machines == NULL) return -1; + session = perf_session__new(&file, false, &mem->tool); + if (session == NULL) + goto out_delete_machine; + if (mem->cpu_list) { ret = perf_session__cpu_bitmap(session, mem->cpu_list, mem->cpu_bitmap); @@ -152,6 +156,8 @@ static int report_raw_events(struct perf_mem *mem) out_delete: perf_session__delete(session); +out_delete_machine: + machines__delete(mem->tool.machines); return err; } diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 25934b9d368f..7ab67139859b 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -667,10 +667,14 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) else signal(SIGUSR2, SIG_IGN); + tool->machines = machines__new(); + if (tool->machines == NULL) + return -1; + session = perf_session__new(file, false, tool); if (session == NULL) { pr_err("Perf session creation failed.\n"); - return -1; + goto out_delete_machines; } fd = perf_data_file__fd(file); @@ -929,6 +933,8 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) out_delete_session: perf_session__delete(session); +out_delete_machines: + machines__delete(tool->machines); return status; } diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 5e53eee5a9a7..8baafb0a561e 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -766,9 +766,13 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused) file.force = report.force; repeat: + report.tool.machines = machines__new(); + if (report.tool.machines == NULL) + return -1; + session = perf_session__new(&file, false, &report.tool); if (session == NULL) - return -1; + goto error_delete; if (report.queue_size) { ordered_events__set_alloc_size(&session->ordered_events, @@ -883,11 +887,14 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused) ret = __cmd_report(&report); if (ret == K_SWITCH_INPUT_DATA) { perf_session__delete(session); + machines__delete(report.tool.machines); goto repeat; } else ret = 0; error: perf_session__delete(session); +error_delete: + machines__delete(report.tool.machines); return ret; } diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 33962612a5e9..f7cea0460656 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -1531,10 +1531,14 @@ static int perf_sched__read_events(struct perf_sched *sched) }; int rc = -1; + sched->tool.machines = machines__new(); + if (sched->tool.machines == NULL) + return -1; + session = perf_session__new(&file, false, &sched->tool); if (session == NULL) { pr_debug("No Memory for session\n"); - return -1; + goto out_delete_machine; } symbol__init(&session->header.env); @@ -1557,6 +1561,8 @@ static int perf_sched__read_events(struct perf_sched *sched) rc = 0; out_delete: perf_session__delete(session); +out_delete_machine: + machines__delete(sched->tool.machines); return rc; } diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index 24809787369f..80f7496e0742 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -1388,21 +1388,27 @@ int find_scripts(char **scripts_array, char **scripts_path_array) .path = input_name, .mode = PERF_DATA_MODE_READ, }; + struct perf_tool tool = { + .machines = NULL, + }; char *temp; - int i = 0; + int i = -1; - session = perf_session__new(&file, false, NULL); - if (!session) + tool.machines = machines__new(); + if (tool.machines == NULL) return -1; + session = perf_session__new(&file, false, &tool); + if (!session) + goto out; + snprintf(scripts_path, MAXPATHLEN, "%s/scripts", perf_exec_path()); scripts_dir = opendir(scripts_path); - if (!scripts_dir) { - perf_session__delete(session); - return -1; - } + if (!scripts_dir) + goto out_session; + i = 0; for_each_lang(scripts_path, scripts_dir, lang_dirent, lang_next) { snprintf(lang_path, MAXPATHLEN, "%s/%s", scripts_path, lang_dirent.d_name); @@ -1440,7 +1446,11 @@ int find_scripts(char **scripts_array, char **scripts_path_array) } closedir(scripts_dir); + +out_session: perf_session__delete(session); +out: + machines__delete(tool.machines); return i; } @@ -1802,9 +1812,13 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused) if (!script_name) setup_pager(); + script.tool.machines = machines__new(); + if (script.tool.machines == NULL) + return -1; + session = perf_session__new(&file, false, &script.tool); if (session == NULL) - return -1; + goto out_delete_machine; if (header || header_only) { perf_session__fprintf_info(session, stdout, show_full_info); @@ -1890,6 +1904,8 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused) out_delete: perf_session__delete(session); +out_delete_machine: + machines__delete(script.tool.machines); if (script_started) cleanup_scripting(); diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c index 30e59620179d..52cac7796014 100644 --- a/tools/perf/builtin-timechart.c +++ b/tools/perf/builtin-timechart.c @@ -1603,13 +1603,17 @@ static int __cmd_timechart(struct timechart *tchart, const char *output_name) .force = tchart->force, }; - struct perf_session *session = perf_session__new(&file, false, - &tchart->tool); + struct perf_session *session; int ret = -EINVAL; - if (session == NULL) + tchart->tool.machines = machines__new(); + if (tchart->tool.machines == NULL) return -1; + session = perf_session__new(&file, false, &tchart->tool); + if (session == NULL) + goto out_delete_machine; + symbol__init(&session->header.env); (void)perf_header__process_sections(&session->header, @@ -1640,6 +1644,8 @@ static int __cmd_timechart(struct timechart *tchart, const char *output_name) (tchart->last_time - tchart->first_time) / 1000000000.0, output_name); out_delete: perf_session__delete(session); +out_delete_machine: + machines__delete(tchart->tool.machines); return ret; } diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index ea6e7bd04f9a..9d99bebae955 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c @@ -933,12 +933,19 @@ static int __cmd_top(struct perf_top *top) { struct record_opts *opts = &top->record_opts; pthread_t thread; - int ret; + int ret = -1; + struct perf_tool tool = { + .machines = NULL, + }; - top->session = perf_session__new(NULL, false, NULL); - if (top->session == NULL) + tool.machines = machines__new(); + if (tool.machines == NULL) return -1; + top->session = perf_session__new(NULL, false, &tool); + if (top->session == NULL) + goto out_delete_machine; + machines__set_symbol_filter(&top->session->machines, symbol_filter); if (!objdump_path) { @@ -1008,6 +1015,8 @@ static int __cmd_top(struct perf_top *top) out_delete: perf_session__delete(top->session); top->session = NULL; +out_delete_machine: + machines__delete(tool.machines); return ret; } diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index e30d0ed1e60f..0e2c60af7cb6 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -2413,9 +2413,13 @@ static int trace__replay(struct trace *trace) /* add tid to output */ trace->multiple_threads = true; + trace->tool.machines = machines__new(); + if (trace->tool.machines == NULL) + return -1; + session = perf_session__new(&file, false, &trace->tool); if (session == NULL) - return -1; + goto out_delete; if (symbol__init(&session->header.env) < 0) goto out; @@ -2475,6 +2479,8 @@ static int trace__replay(struct trace *trace) out: perf_session__delete(session); +out_delete: + machines__delete(trace->tool.machines); return err; } diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c index 5bfc1198ab46..270e0298c9f3 100644 --- a/tools/perf/util/data-convert-bt.c +++ b/tools/perf/util/data-convert-bt.c @@ -1133,10 +1133,14 @@ int bt_convert__perf2ctf(const char *input, const char *path, bool force) if (ctf_writer__init(cw, path)) return -1; + c.tool.machines = machines__new(); + if (c.tool.machines == NULL) + goto free_writer; + /* perf.data session */ session = perf_session__new(&file, 0, &c.tool); if (!session) - goto free_writer; + goto free_machines; if (c.queue_size) { ordered_events__set_alloc_size(&session->ordered_events, @@ -1176,6 +1180,8 @@ int bt_convert__perf2ctf(const char *input, const char *path, bool force) free_session: perf_session__delete(session); +free_machines: + machines__delete(c.tool.machines); free_writer: ctf_writer__cleanup(cw); pr_err("Error during conversion setup.\n"); diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 308656be8ddb..d770b705cb16 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -163,6 +163,21 @@ void machines__exit(struct machines *machines) /* XXX exit guest */ } +struct machines *machines__new(void) +{ + struct machines *machines = zalloc(sizeof(*machines)); + + if (machines) + machines__init(machines); + return machines; +} + +void machines__delete(struct machines *machines) +{ + machines__exit(machines); + free(machines); +} + struct machine *machines__add(struct machines *machines, pid_t pid, const char *root_dir) { diff --git a/tools/perf/util/machine.h b/tools/perf/util/machine.h index f0f6bd420237..81494371f459 100644 --- a/tools/perf/util/machine.h +++ b/tools/perf/util/machine.h @@ -102,6 +102,9 @@ struct machines { void machines__init(struct machines *machines); void machines__exit(struct machines *machines); +struct machines *machines__new(void); +void machines__delete(struct machines *machines); + void machines__process_guests(struct machines *machines, machine__process_t process, void *data); diff --git a/tools/perf/util/tool.h b/tools/perf/util/tool.h index 7f282ad1d2bd..2d399eba236b 100644 --- a/tools/perf/util/tool.h +++ b/tools/perf/util/tool.h @@ -12,6 +12,7 @@ struct perf_evsel; struct perf_sample; struct perf_tool; struct machine; +struct machines; struct ordered_events; typedef int (*event_sample)(struct perf_tool *tool, union perf_event *event, @@ -35,6 +36,7 @@ typedef s64 (*event_op3)(struct perf_tool *tool, union perf_event *event, struct perf_session *session); struct perf_tool { + struct machines *machines; event_sample sample, read; event_op mmap, -- 2.4.1