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