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 52 int nr_cmdline; 53 int nr_sibling_cores; 54 int nr_sibling_dies; 55 int nr_sibling_threads; 56 int nr_numa_nodes; 57 int nr_memory_nodes; 58 int nr_pmu_mappings; 59 int nr_groups; 60 char *cmdline; 61 const char **cmdline_argv; 62 char *sibling_cores; 63 char *sibling_dies; 64 char *sibling_threads; 65 char *pmu_mappings; 66 struct cpu_topology_map *cpu; 67 struct cpu_cache_level *caches; 68 int caches_cnt; 69 u32 comp_ratio; 70 u32 comp_ver; 71 u32 comp_type; 72 u32 comp_level; 73 u32 comp_mmap_len; 74 struct numa_node *numa_nodes; 75 struct memory_node *memory_nodes; 76 unsigned long long memory_bsize; 77 u64 clockid_res_ns; 78 79 /* 80 * bpf_info_lock protects bpf rbtrees. This is needed because the 81 * trees are accessed by different threads in perf-top 82 */ 83 struct { 84 struct rw_semaphore lock; 85 struct rb_root infos; 86 u32 infos_cnt; 87 struct rb_root btfs; 88 u32 btfs_cnt; 89 } bpf_progs; 90 91 /* same reason as above (for perf-top) */ 92 struct { 93 struct rw_semaphore lock; 94 struct rb_root tree; 95 } cgroups; 96 97 /* For fast cpu to numa node lookup via perf_env__numa_node */ 98 int *numa_map; 99 int nr_numa_map; 100 }; 101 102 enum perf_compress_type { 103 PERF_COMP_NONE = 0, 104 PERF_COMP_ZSTD, 105 PERF_COMP_MAX 106 }; 107 108 struct bpf_prog_info_node; 109 struct btf_node; 110 111 extern struct perf_env perf_env; 112 113 void perf_env__exit(struct perf_env *env); 114 115 int perf_env__set_cmdline(struct perf_env *env, int argc, const char *argv[]); 116 117 int perf_env__read_cpuid(struct perf_env *env); 118 int perf_env__read_cpu_topology_map(struct perf_env *env); 119 120 void cpu_cache_level__free(struct cpu_cache_level *cache); 121 122 const char *perf_env__arch(struct perf_env *env); 123 const char *perf_env__raw_arch(struct perf_env *env); 124 int perf_env__nr_cpus_avail(struct perf_env *env); 125 126 void perf_env__init(struct perf_env *env); 127 void perf_env__insert_bpf_prog_info(struct perf_env *env, 128 struct bpf_prog_info_node *info_node); 129 struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env, 130 __u32 prog_id); 131 void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node); 132 struct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id); 133 134 int perf_env__numa_node(struct perf_env *env, int cpu); 135 #endif /* __PERF_ENV_H */ 136