projects/linux·blob master · refs

245 lines · 6.3 KiB

1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __PERF_ENV_H
3#define __PERF_ENV_H
4
5#include <linux/types.h>
6#include <linux/rbtree.h>
7#include "cpumap.h"
8#include "rwsem.h"
9#include "mutex.h"
10
11struct perf_cpu_map;
12
13struct cpu_topology_map {
14 int socket_id;
15 int die_id;
16 int cluster_id;
17 int core_id;
18};
19
20struct cpu_cache_level {
21 u32 level;
22 u32 line_size;
23 u32 sets;
24 u32 ways;
25 char *type;
26 char *size;
27 char *map;
28};
29
30struct numa_node {
31 u32 node;
32 u64 mem_total;
33 u64 mem_free;
34 struct perf_cpu_map *map;
35};
36
37struct memory_node {
38 u64 node;
39 u64 size;
40 unsigned long *set;
41};
42
43struct hybrid_node {
44 char *pmu_name;
45 char *cpus;
46};
47
48struct pmu_caps {
49 int nr_caps;
50 unsigned int max_branches;
51 unsigned int br_cntr_nr;
52 unsigned int br_cntr_width;
53
54 char **caps;
55 char *pmu_name;
56};
57
58struct domain_info {
59 u32 domain;
60 char *dname;
61 char *cpumask;
62 char *cpulist;
63};
64
65struct cpu_domain_map {
66 u32 cpu;
67 u32 nr_domains;
68 struct domain_info **domains;
69};
70
71struct perf_env {
72 char *hostname;
73 char *os_release;
74 char *version;
75 char *arch;
76 /* e_machine expanded from 16 to 32-bits for alignment. */
77 u32 e_machine;
78 u32 e_flags;
79 int nr_cpus_online;
80 int nr_cpus_avail;
81 char *cpu_desc;
82 char *cpuid;
83 unsigned long long total_mem;
84 unsigned int msr_pmu_type;
85 unsigned int max_branches;
86 unsigned int br_cntr_nr;
87 unsigned int br_cntr_width;
88 unsigned int schedstat_version;
89 unsigned int max_sched_domains;
90 int kernel_is_64_bit;
91
92 int nr_cmdline;
93 int nr_sibling_cores;
94 int nr_sibling_dies;
95 int nr_sibling_threads;
96 int nr_numa_nodes;
97 int nr_memory_nodes;
98 int nr_pmu_mappings;
99 int nr_groups;
100 int nr_cpu_pmu_caps;
101 int nr_hybrid_nodes;
102 int nr_pmus_with_caps;
103 char *cmdline;
104 const char **cmdline_argv;
105 char *sibling_cores;
106 char *sibling_dies;
107 char *sibling_threads;
108 char *pmu_mappings;
109 char **cpu_pmu_caps;
110 struct cpu_topology_map *cpu;
111 struct cpu_cache_level *caches;
112 struct cpu_domain_map **cpu_domain;
113 int caches_cnt;
114 unsigned int cln_size;
115 u32 comp_ratio;
116 u32 comp_ver;
117 u32 comp_type;
118 u32 comp_level;
119 u32 comp_mmap_len;
120 struct numa_node *numa_nodes;
121 struct memory_node *memory_nodes;
122 unsigned long long memory_bsize;
123 struct hybrid_node *hybrid_nodes;
124 struct pmu_caps *pmu_caps;
125#ifdef HAVE_LIBBPF_SUPPORT
126 /*
127 * bpf_info_lock protects bpf rbtrees. This is needed because the
128 * trees are accessed by different threads in perf-top
129 */
130 struct {
131 struct rw_semaphore lock;
132 struct rb_root infos;
133 u32 infos_cnt;
134 struct rb_root btfs;
135 u32 btfs_cnt;
136 } bpf_progs;
137#endif // HAVE_LIBBPF_SUPPORT
138 /* same reason as above (for perf-top) */
139 struct {
140 struct rw_semaphore lock;
141 struct rb_root tree;
142 } cgroups;
143
144 /* For fast cpu to numa node lookup via perf_env__numa_node */
145 int *numa_map;
146 int nr_numa_map;
147
148 /* For real clock time reference. */
149 struct {
150 u64 tod_ns;
151 u64 clockid_ns;
152 u64 clockid_res_ns;
153 int clockid;
154 /*
155 * enabled is valid for report mode, and is true if above
156 * values are set, it's set in process_clock_data
157 */
158 bool enabled;
159 } clock;
160 /* Protects lazy environment initialization (e.g. os_release, e_machine). */
161 struct mutex lock;
162};
163
164enum perf_compress_type {
165 PERF_COMP_NONE = 0,
166 PERF_COMP_ZSTD,
167 PERF_COMP_MAX
168};
169
170struct bpf_prog_info_node;
171struct btf_node;
172
173int perf_env__read_core_pmu_caps(struct perf_env *env);
174void free_cpu_domain_info(struct cpu_domain_map **cd_map, u32 schedstat_version, u32 nr);
175void perf_env__exit(struct perf_env *env);
176
177int perf_env__kernel_is_64_bit(struct perf_env *env);
178bool perf_arch_is_big_endian(const char *arch);
179const char *perf_env__os_release(struct perf_env *env);
180
181int perf_env__set_cmdline(struct perf_env *env, int argc, const char *argv[]);
182
183int perf_env__read_cpuid(struct perf_env *env);
184int perf_env__read_pmu_mappings(struct perf_env *env);
185int perf_env__nr_pmu_mappings(struct perf_env *env);
186const char *perf_env__pmu_mappings(struct perf_env *env);
187
188int perf_env__read_cpu_topology_map(struct perf_env *env);
189
190/*
191 * Safe accessor for env->cpu[] topology array. env->cpu can be NULL when
192 * reading old-format perf.data that predates topology information —
193 * process_cpu_topology() in header.c frees it while nr_cpus_avail remains
194 * set, so callers must not index env->cpu[] without this check.
195 */
196static inline struct cpu_topology_map *
197perf_env__get_cpu_topology(struct perf_env *env, struct perf_cpu cpu)
198{
199 if (env->cpu && cpu.cpu >= 0 && cpu.cpu < env->nr_cpus_avail)
200 return &env->cpu[cpu.cpu];
201 return NULL;
202}
203
204void cpu_cache_level__free(struct cpu_cache_level *cache);
205
206uint16_t perf_env__e_machine_nocache(struct perf_env *env, uint32_t *e_flags);
207uint16_t perf_env__e_machine(struct perf_env *env, uint32_t *e_flags);
208const char *perf_env__arch(struct perf_env *env);
209const char *perf_env__arch_strerrno(uint16_t e_machine, int err);
210const char *perf_env__cpuid(struct perf_env *env);
211int perf_env__nr_cpus_avail(struct perf_env *env);
212
213void perf_env__init(struct perf_env *env);
214#ifdef HAVE_LIBBPF_SUPPORT
215bool __perf_env__insert_bpf_prog_info(struct perf_env *env,
216 struct bpf_prog_info_node *info_node);
217bool perf_env__insert_bpf_prog_info(struct perf_env *env,
218 struct bpf_prog_info_node *info_node);
219struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env,
220 __u32 prog_id);
221void perf_env__iterate_bpf_prog_info(struct perf_env *env,
222 void (*cb)(struct bpf_prog_info_node *node,
223 void *data),
224 void *data);
225bool perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node);
226bool __perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node);
227struct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id);
228struct btf_node *__perf_env__find_btf(struct perf_env *env, __u32 btf_id);
229#endif // HAVE_LIBBPF_SUPPORT
230
231int perf_env__numa_node(struct perf_env *env, struct perf_cpu cpu);
232char *perf_env__find_pmu_cap(struct perf_env *env, const char *pmu_name,
233 const char *cap);
234
235bool perf_env__has_pmu_mapping(struct perf_env *env, const char *pmu_name);
236void perf_env__find_br_cntr_info(struct perf_env *env,
237 unsigned int *nr,
238 unsigned int *width);
239
240bool x86__is_amd_cpu(void);
241bool perf_env__is_x86_amd_cpu(struct perf_env *env);
242bool x86__is_intel_cpu(void);
243bool perf_env__is_x86_intel_cpu(struct perf_env *env);
244
245#endif /* __PERF_ENV_H */