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>
This commit is contained in:
Ian Rogers 2026-06-02 08:25:13 -07:00 committed by Arnaldo Carvalho de Melo
parent da976dd484
commit 0ff9718c26
2 changed files with 8 additions and 0 deletions

View 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);

View 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 {