Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[sfrench/cifs-2.6.git] / tools / perf / util / env.h
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
10 struct perf_cpu_map;
11
12 struct cpu_topology_map {
13         int     socket_id;
14         int     die_id;
15         int     cluster_id;
16         int     core_id;
17 };
18
19 struct cpu_cache_level {
20         u32     level;
21         u32     line_size;
22         u32     sets;
23         u32     ways;
24         char    *type;
25         char    *size;
26         char    *map;
27 };
28
29 struct numa_node {
30         u32              node;
31         u64              mem_total;
32         u64              mem_free;
33         struct perf_cpu_map     *map;
34 };
35
36 struct memory_node {
37         u64              node;
38         u64              size;
39         unsigned long   *set;
40 };
41
42 struct hybrid_node {
43         char    *pmu_name;
44         char    *cpus;
45 };
46
47 struct pmu_caps {
48         int             nr_caps;
49         unsigned int    max_branches;
50         unsigned int    br_cntr_nr;
51         unsigned int    br_cntr_width;
52
53         char            **caps;
54         char            *pmu_name;
55 };
56
57 typedef const char *(arch_syscalls__strerrno_t)(int err);
58
59 arch_syscalls__strerrno_t *arch_syscalls__strerrno_function(const char *arch);
60
61 struct perf_env {
62         char                    *hostname;
63         char                    *os_release;
64         char                    *version;
65         char                    *arch;
66         int                     nr_cpus_online;
67         int                     nr_cpus_avail;
68         char                    *cpu_desc;
69         char                    *cpuid;
70         unsigned long long      total_mem;
71         unsigned int            msr_pmu_type;
72         unsigned int            max_branches;
73         unsigned int            br_cntr_nr;
74         unsigned int            br_cntr_width;
75         int                     kernel_is_64_bit;
76
77         int                     nr_cmdline;
78         int                     nr_sibling_cores;
79         int                     nr_sibling_dies;
80         int                     nr_sibling_threads;
81         int                     nr_numa_nodes;
82         int                     nr_memory_nodes;
83         int                     nr_pmu_mappings;
84         int                     nr_groups;
85         int                     nr_cpu_pmu_caps;
86         int                     nr_hybrid_nodes;
87         int                     nr_pmus_with_caps;
88         char                    *cmdline;
89         const char              **cmdline_argv;
90         char                    *sibling_cores;
91         char                    *sibling_dies;
92         char                    *sibling_threads;
93         char                    *pmu_mappings;
94         char                    **cpu_pmu_caps;
95         struct cpu_topology_map *cpu;
96         struct cpu_cache_level  *caches;
97         int                      caches_cnt;
98         u32                     comp_ratio;
99         u32                     comp_ver;
100         u32                     comp_type;
101         u32                     comp_level;
102         u32                     comp_mmap_len;
103         struct numa_node        *numa_nodes;
104         struct memory_node      *memory_nodes;
105         unsigned long long       memory_bsize;
106         struct hybrid_node      *hybrid_nodes;
107         struct pmu_caps         *pmu_caps;
108 #ifdef HAVE_LIBBPF_SUPPORT
109         /*
110          * bpf_info_lock protects bpf rbtrees. This is needed because the
111          * trees are accessed by different threads in perf-top
112          */
113         struct {
114                 struct rw_semaphore     lock;
115                 struct rb_root          infos;
116                 u32                     infos_cnt;
117                 struct rb_root          btfs;
118                 u32                     btfs_cnt;
119         } bpf_progs;
120 #endif // HAVE_LIBBPF_SUPPORT
121         /* same reason as above (for perf-top) */
122         struct {
123                 struct rw_semaphore     lock;
124                 struct rb_root          tree;
125         } cgroups;
126
127         /* For fast cpu to numa node lookup via perf_env__numa_node */
128         int                     *numa_map;
129         int                      nr_numa_map;
130
131         /* For real clock time reference. */
132         struct {
133                 u64     tod_ns;
134                 u64     clockid_ns;
135                 u64     clockid_res_ns;
136                 int     clockid;
137                 /*
138                  * enabled is valid for report mode, and is true if above
139                  * values are set, it's set in process_clock_data
140                  */
141                 bool    enabled;
142         } clock;
143         arch_syscalls__strerrno_t *arch_strerrno;
144 };
145
146 enum perf_compress_type {
147         PERF_COMP_NONE = 0,
148         PERF_COMP_ZSTD,
149         PERF_COMP_MAX
150 };
151
152 struct bpf_prog_info_node;
153 struct btf_node;
154
155 extern struct perf_env perf_env;
156
157 void perf_env__exit(struct perf_env *env);
158
159 int perf_env__kernel_is_64_bit(struct perf_env *env);
160
161 int perf_env__set_cmdline(struct perf_env *env, int argc, const char *argv[]);
162
163 int perf_env__read_cpuid(struct perf_env *env);
164 int perf_env__read_pmu_mappings(struct perf_env *env);
165 int perf_env__nr_pmu_mappings(struct perf_env *env);
166 const char *perf_env__pmu_mappings(struct perf_env *env);
167
168 int perf_env__read_cpu_topology_map(struct perf_env *env);
169
170 void cpu_cache_level__free(struct cpu_cache_level *cache);
171
172 const char *perf_env__arch(struct perf_env *env);
173 const char *perf_env__arch_strerrno(struct perf_env *env, int err);
174 const char *perf_env__cpuid(struct perf_env *env);
175 const char *perf_env__raw_arch(struct perf_env *env);
176 int perf_env__nr_cpus_avail(struct perf_env *env);
177
178 void perf_env__init(struct perf_env *env);
179 void __perf_env__insert_bpf_prog_info(struct perf_env *env,
180                                       struct bpf_prog_info_node *info_node);
181 void perf_env__insert_bpf_prog_info(struct perf_env *env,
182                                     struct bpf_prog_info_node *info_node);
183 struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env,
184                                                         __u32 prog_id);
185 bool perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node);
186 bool __perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node);
187 struct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id);
188 struct btf_node *__perf_env__find_btf(struct perf_env *env, __u32 btf_id);
189
190 int perf_env__numa_node(struct perf_env *env, struct perf_cpu cpu);
191 char *perf_env__find_pmu_cap(struct perf_env *env, const char *pmu_name,
192                              const char *cap);
193
194 bool perf_env__has_pmu_mapping(struct perf_env *env, const char *pmu_name);
195 #endif /* __PERF_ENV_H */