summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Rogers <irogers@google.com>2026-06-02 08:25:13 -0700
committerArnaldo Carvalho de Melo <acme@redhat.com>2026-06-03 16:52:49 -0300
commit0ff9718c266f9eb334674377501ccf37d8d351a4 (patch)
treece196e8d76e9e5e8dcc4fdc9fc0bcf0c438425af
parentda976dd4842981fa9fe8bf736ec3d440fa9ce029 (diff)
perf env: Add mutex to protect lazy environment initialization
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>
-rw-r--r--tools/perf/util/env.c5
-rw-r--r--tools/perf/util/env.h3
2 files changed, 8 insertions, 0 deletions
diff --git a/tools/perf/util/env.c b/tools/perf/util/env.c
index 28c54c58193e..03d90a45992c 100644
--- a/tools/perf/util/env.c
+++ b/tools/perf/util/env.c
@@ -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);
diff --git a/tools/perf/util/env.h b/tools/perf/util/env.h
index 83e74328798f..6aaf80c640bd 100644
--- a/tools/perf/util/env.h
+++ b/tools/perf/util/env.h
@@ -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 {