mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-17 06:40:11 -05:00
perf top: Make perf_env locally scoped
The use of the global host perf_env variable is potentially inconsistent within the code. Switch perf top to using a locally scoped variable that is generally accessed through the session. Signed-off-by: Ian Rogers <irogers@google.com> Link: https://lore.kernel.org/r/20250724163302.596743-15-irogers@google.com Signed-off-by: Namhyung Kim <namhyung@kernel.org>
This commit is contained in:
@@ -1301,7 +1301,7 @@ static int __cmd_top(struct perf_top *top)
|
||||
perf_set_multithreaded();
|
||||
|
||||
if (perf_hpp_list.socket) {
|
||||
ret = perf_env__read_cpu_topology_map(&perf_env);
|
||||
ret = perf_env__read_cpu_topology_map(perf_session__env(top->session));
|
||||
if (ret < 0) {
|
||||
char errbuf[BUFSIZ];
|
||||
const char *err = str_error_r(-ret, errbuf, sizeof(errbuf));
|
||||
@@ -1624,6 +1624,7 @@ int cmd_top(int argc, const char **argv)
|
||||
NULL
|
||||
};
|
||||
int status = hists__init();
|
||||
struct perf_env host_env;
|
||||
|
||||
if (status < 0)
|
||||
return status;
|
||||
@@ -1637,14 +1638,19 @@ int cmd_top(int argc, const char **argv)
|
||||
if (top.evlist == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
perf_env__init(&host_env);
|
||||
status = perf_config(perf_top_config, &top);
|
||||
if (status)
|
||||
return status;
|
||||
goto out_delete_evlist;
|
||||
/*
|
||||
* Since the per arch annotation init routine may need the cpuid, read
|
||||
* it here, since we are not getting this from the perf.data header.
|
||||
*/
|
||||
status = perf_env__read_cpuid(&perf_env);
|
||||
status = perf_env__set_cmdline(&host_env, argc, argv);
|
||||
if (status)
|
||||
goto out_delete_evlist;
|
||||
|
||||
status = perf_env__read_cpuid(&host_env);
|
||||
if (status) {
|
||||
/*
|
||||
* Some arches do not provide a get_cpuid(), so just use pr_debug, otherwise
|
||||
@@ -1661,18 +1667,24 @@ int cmd_top(int argc, const char **argv)
|
||||
|
||||
if (disassembler_style) {
|
||||
annotate_opts.disassembler_style = strdup(disassembler_style);
|
||||
if (!annotate_opts.disassembler_style)
|
||||
return -ENOMEM;
|
||||
if (!annotate_opts.disassembler_style) {
|
||||
status = -ENOMEM;
|
||||
goto out_delete_evlist;
|
||||
}
|
||||
}
|
||||
if (objdump_path) {
|
||||
annotate_opts.objdump_path = strdup(objdump_path);
|
||||
if (!annotate_opts.objdump_path)
|
||||
return -ENOMEM;
|
||||
if (!annotate_opts.objdump_path) {
|
||||
status = -ENOMEM;
|
||||
goto out_delete_evlist;
|
||||
}
|
||||
}
|
||||
if (addr2line_path) {
|
||||
symbol_conf.addr2line_path = strdup(addr2line_path);
|
||||
if (!symbol_conf.addr2line_path)
|
||||
return -ENOMEM;
|
||||
if (!symbol_conf.addr2line_path) {
|
||||
status = -ENOMEM;
|
||||
goto out_delete_evlist;
|
||||
}
|
||||
}
|
||||
|
||||
status = symbol__validate_sym_arguments();
|
||||
@@ -1735,7 +1747,7 @@ int cmd_top(int argc, const char **argv)
|
||||
symbol_conf.show_branchflag_count = true;
|
||||
|
||||
if (opts->branch_stack) {
|
||||
status = perf_env__read_core_pmu_caps(&perf_env);
|
||||
status = perf_env__read_core_pmu_caps(&host_env);
|
||||
if (status) {
|
||||
pr_err("PMU capability data is not available\n");
|
||||
goto out_delete_evlist;
|
||||
@@ -1829,14 +1841,16 @@ int cmd_top(int argc, const char **argv)
|
||||
perf_top__update_print_entries(&top);
|
||||
signal(SIGWINCH, winch_sig);
|
||||
}
|
||||
top.session->env = &perf_env;
|
||||
|
||||
top.session = perf_session__new(NULL, NULL);
|
||||
top.session = __perf_session__new(/*data=*/NULL, /*tool=*/NULL,
|
||||
/*trace_event_repipe=*/false,
|
||||
&host_env);
|
||||
if (IS_ERR(top.session)) {
|
||||
status = PTR_ERR(top.session);
|
||||
top.session = NULL;
|
||||
goto out_delete_evlist;
|
||||
}
|
||||
top.evlist->session = top.session;
|
||||
|
||||
if (!evlist__needs_bpf_sb_event(top.evlist))
|
||||
top.record_opts.no_bpf_event = true;
|
||||
@@ -1851,7 +1865,7 @@ int cmd_top(int argc, const char **argv)
|
||||
goto out_delete_evlist;
|
||||
}
|
||||
|
||||
if (evlist__add_bpf_sb_event(top.sb_evlist, &perf_env)) {
|
||||
if (evlist__add_bpf_sb_event(top.sb_evlist, &host_env)) {
|
||||
pr_err("Couldn't ask for PERF_RECORD_BPF_EVENT side band events.\n.");
|
||||
status = -EINVAL;
|
||||
goto out_delete_evlist;
|
||||
@@ -1873,6 +1887,7 @@ int cmd_top(int argc, const char **argv)
|
||||
evlist__delete(top.evlist);
|
||||
perf_session__delete(top.session);
|
||||
annotation_options__exit();
|
||||
perf_env__exit(&host_env);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user