1 // SPDX-License-Identifier: GPL-2.0
6 #include <sys/utsname.h>
8 struct perf_env perf_env;
10 void perf_env__exit(struct perf_env *env)
14 zfree(&env->hostname);
15 zfree(&env->os_release);
18 zfree(&env->cpu_desc);
21 zfree(&env->cmdline_argv);
22 zfree(&env->sibling_cores);
23 zfree(&env->sibling_threads);
24 zfree(&env->pmu_mappings);
27 for (i = 0; i < env->nr_numa_nodes; i++)
28 cpu_map__put(env->numa_nodes[i].map);
29 zfree(&env->numa_nodes);
31 for (i = 0; i < env->caches_cnt; i++)
32 cpu_cache_level__free(&env->caches[i]);
36 int perf_env__set_cmdline(struct perf_env *env, int argc, const char *argv[])
40 /* do not include NULL termination */
41 env->cmdline_argv = calloc(argc, sizeof(char *));
42 if (env->cmdline_argv == NULL)
46 * Must copy argv contents because it gets moved around during option
49 for (i = 0; i < argc ; i++) {
50 env->cmdline_argv[i] = argv[i];
51 if (env->cmdline_argv[i] == NULL)
55 env->nr_cmdline = argc;
59 zfree(&env->cmdline_argv);
64 int perf_env__read_cpu_topology_map(struct perf_env *env)
71 if (env->nr_cpus_avail == 0)
72 env->nr_cpus_avail = cpu__max_present_cpu();
74 nr_cpus = env->nr_cpus_avail;
78 env->cpu = calloc(nr_cpus, sizeof(env->cpu[0]));
82 for (cpu = 0; cpu < nr_cpus; ++cpu) {
83 env->cpu[cpu].core_id = cpu_map__get_core_id(cpu);
84 env->cpu[cpu].socket_id = cpu_map__get_socket_id(cpu);
87 env->nr_cpus_avail = nr_cpus;
91 static int perf_env__read_arch(struct perf_env *env)
99 env->arch = strdup(uts.machine);
101 return env->arch ? 0 : -ENOMEM;
104 static int perf_env__read_nr_cpus_avail(struct perf_env *env)
106 if (env->nr_cpus_avail == 0)
107 env->nr_cpus_avail = cpu__max_present_cpu();
109 return env->nr_cpus_avail ? 0 : -ENOENT;
112 const char *perf_env__raw_arch(struct perf_env *env)
114 return env && !perf_env__read_arch(env) ? env->arch : "unknown";
117 int perf_env__nr_cpus_avail(struct perf_env *env)
119 return env && !perf_env__read_nr_cpus_avail(env) ? env->nr_cpus_avail : 0;
122 void cpu_cache_level__free(struct cpu_cache_level *cache)