]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
perf top: Make perf_env locally scoped
authorIan Rogers <irogers@google.com>
Thu, 24 Jul 2025 16:32:54 +0000 (09:32 -0700)
committerNamhyung Kim <namhyung@kernel.org>
Fri, 25 Jul 2025 17:37:57 +0000 (10:37 -0700)
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>
tools/perf/builtin-top.c

index 2760971d4c97c275aaf6f23f8297d346c9b43f6f..e9743f17bd0ce8952a93ce3012eca701c9c28ab6 100644 (file)
@@ -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 @@ out_delete_evlist:
        evlist__delete(top.evlist);
        perf_session__delete(top.session);
        annotation_options__exit();
+       perf_env__exit(&host_env);
 
        return status;
 }