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 perf_env { 41 char *hostname; 42 char *os_release; 43 char *version; 44 char *arch; 45 int nr_cpus_online; 46 int nr_cpus_avail; 47 char *cpu_desc; 48 char *cpuid; 49 unsigned long long total_mem; 50 unsigned int msr_pmu_type; 51 unsigned int max_branches; 52 53 int nr_cmdline; 54 int nr_sibling_cores; 55 int nr_sibling_dies; 56 int nr_sibling_threads; 57 int nr_numa_nodes; 58 int nr_memory_nodes; 59 int nr_pmu_mappings; 60 int nr_groups; 61 int nr_cpu_pmu_caps; 62 char *cmdline; 63 const char **cmdline_argv; 64 char *sibling_cores; 65 char *sibling_dies; 66 char *sibling_threads; 67 char *pmu_mappings; 68 char *cpu_pmu_caps; 69 struct cpu_topology_map *cpu; 70 struct cpu_cache_level *caches; 71 int caches_cnt; 72 u32 comp_ratio; 73 u32 comp_ver; 74 u32 comp_type; 75 u32 comp_level; 76 u32 comp_mmap_len; 77 struct numa_node *numa_nodes; 78 struct memory_node *memory_nodes; 79 unsigned long long memory_bsize; 80 #ifdef HAVE_LIBBPF_SUPPORT 81 /* 82 * bpf_info_lock protects bpf rbtrees. This is needed because the 83 * trees are accessed by different threads in perf-top 84 */ 85 struct { 86 struct rw_semaphore lock; 87 struct rb_root infos; 88 u32 infos_cnt; 89 struct rb_root btfs; 90 u32 btfs_cnt; 91 } bpf_progs; 92 #endif // HAVE_LIBBPF_SUPPORT 93 /* same reason as above (for perf-top) */ 94 struct { 95 struct rw_semaphore lock; 96 struct rb_root tree; 97 } cgroups; 98 99 /* For fast cpu to numa node lookup via perf_env__numa_node */ 100 int *numa_map; 101 int nr_numa_map; 102 103 /* For real clock time reference. */ 104 struct { 105 u64 tod_ns; 106 u64 clockid_ns; 107 u64 clockid_res_ns; 108 int clockid; 109 /* 110 * enabled is valid for report mode, and is true if above 111 * values are set, it's set in process_clock_data 112 */ 113 bool enabled; 114 } clock; 115 }; 116 117 enum perf_compress_type { 118 PERF_COMP_NONE = 0, 119 PERF_COMP_ZSTD, 120 PERF_COMP_MAX 121 }; 122 123 struct bpf_prog_info_node; 124 struct btf_node; 125 126 extern struct perf_env perf_env; 127 128 void perf_env__exit(struct perf_env *env); 129 130 int perf_env__set_cmdline(struct perf_env *env, int argc, const char *argv[]); 131 132 int perf_env__read_cpuid(struct perf_env *env); 133 int perf_env__read_cpu_topology_map(struct perf_env *env); 134 135 void cpu_cache_level__free(struct cpu_cache_level *cache); 136 137 const char *perf_env__arch(struct perf_env *env); 138 const char *perf_env__raw_arch(struct perf_env *env); 139 int perf_env__nr_cpus_avail(struct perf_env *env); 140 141 void perf_env__init(struct perf_env *env); 142 void perf_env__insert_bpf_prog_info(struct perf_env *env, 143 struct bpf_prog_info_node *info_node); 144 struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env, 145 __u32 prog_id); 146 void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node); 147 struct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id); 148 149 int perf_env__numa_node(struct perf_env *env, int cpu); 150 #endif /* __PERF_ENV_H */ 151