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>
{
int i, j;
+ mutex_destroy(&env->lock);
+
perf_env__purge_bpf(env);
perf_env__purge_cgroups(env);
zfree(&env->hostname);
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)
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);
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);
#include <linux/rbtree.h>
#include "cpumap.h"
#include "rwsem.h"
+#include "mutex.h"
struct perf_cpu_map;
*/
bool enabled;
} clock;
+ /* Protects lazy environment initialization (e.g. os_release, e_machine). */
+ struct mutex lock;
};
enum perf_compress_type {