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