env.h 5.6 KB

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