]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf env: Add mutex to protect lazy environment initialization
authorIan Rogers <irogers@google.com>
Tue, 2 Jun 2026 15:25:13 +0000 (08:25 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 3 Jun 2026 19:52:49 +0000 (16:52 -0300)
Introduce a mutex to 'struct perf_env' to safely protect lazy
metadata setup, such as os_release or e_machine resolution,
preventing concurrent initialization data races and memory leaks
during multi-threaded profiling or symbol loading.

Signed-off-by: Ian Rogers <irogers@google.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Alexander Gordeev <agordeev@linux.ibm.com>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Honglei Wang <jameshongleiwang@126.com>
Cc: Jan Polensky <japo@linux.ibm.com>
Cc: Sumanth Korikkar <sumanthk@linux.ibm.com>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/env.c
tools/perf/util/env.h

index 28c54c58193e48e70bc54f1a807a7da106db83eb..03d90a45992c33a83c0db07861c1bae6809b2dd8 100644 (file)
@@ -250,6 +250,8 @@ void perf_env__exit(struct perf_env *env)
 {
        int i, j;
 
+       mutex_destroy(&env->lock);
+
        perf_env__purge_bpf(env);
        perf_env__purge_cgroups(env);
        zfree(&env->hostname);
@@ -307,6 +309,7 @@ void perf_env__init(struct perf_env *env)
        init_rwsem(&env->bpf_progs.lock);
 #endif
        env->kernel_is_64_bit = -1;
+       mutex_init(&env->lock);
 }
 
 static void perf_env__init_kernel_mode(struct perf_env *env)
@@ -1014,6 +1017,7 @@ bool x86__is_amd_cpu(void)
        struct perf_env env = { .total_mem = 0, };
        bool is_amd;
 
+       perf_env__init(&env);
        perf_env__cpuid(&env);
        is_amd = perf_env__is_x86_amd_cpu(&env);
        perf_env__exit(&env);
@@ -1036,6 +1040,7 @@ bool x86__is_intel_cpu(void)
        struct perf_env env = { .total_mem = 0, };
        bool is_intel;
 
+       perf_env__init(&env);
        perf_env__cpuid(&env);
        is_intel = perf_env__is_x86_intel_cpu(&env);
        perf_env__exit(&env);
index 83e74328798f1cf2fff6add7d27d9f5e3340bedf..6aaf80c640bd061165b3201567ecdfe29ea98b71 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/rbtree.h>
 #include "cpumap.h"
 #include "rwsem.h"
+#include "mutex.h"
 
 struct perf_cpu_map;
 
@@ -156,6 +157,8 @@ struct perf_env {
                 */
                bool    enabled;
        } clock;
+       /* Protects lazy environment initialization (e.g. os_release, e_machine). */
+       struct mutex            lock;
 };
 
 enum perf_compress_type {