xref: /linux/tools/perf/util/env.h (revision 9d88a1a170edfc89cdb2ef9ca07e53d74359081e)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2f0ce888cSArnaldo Carvalho de Melo #ifndef __PERF_ENV_H
3f0ce888cSArnaldo Carvalho de Melo #define __PERF_ENV_H
4f0ce888cSArnaldo Carvalho de Melo 
5720e98b5SJiri Olsa #include <linux/types.h>
6e4378f0cSSong Liu #include <linux/rbtree.h>
7e4378f0cSSong Liu #include "rwsem.h"
8720e98b5SJiri Olsa 
987ffb6c6SArnaldo Carvalho de Melo struct perf_cpu_map;
1087ffb6c6SArnaldo Carvalho de Melo 
11f0ce888cSArnaldo Carvalho de Melo struct cpu_topology_map {
12f0ce888cSArnaldo Carvalho de Melo 	int	socket_id;
13acae8b36SKan Liang 	int	die_id;
14f0ce888cSArnaldo Carvalho de Melo 	int	core_id;
15f0ce888cSArnaldo Carvalho de Melo };
16f0ce888cSArnaldo Carvalho de Melo 
17720e98b5SJiri Olsa struct cpu_cache_level {
18720e98b5SJiri Olsa 	u32	level;
19720e98b5SJiri Olsa 	u32	line_size;
20720e98b5SJiri Olsa 	u32	sets;
21720e98b5SJiri Olsa 	u32	ways;
22720e98b5SJiri Olsa 	char	*type;
23720e98b5SJiri Olsa 	char	*size;
24720e98b5SJiri Olsa 	char	*map;
25720e98b5SJiri Olsa };
26720e98b5SJiri Olsa 
27c60da22aSJiri Olsa struct numa_node {
28c60da22aSJiri Olsa 	u32		 node;
29c60da22aSJiri Olsa 	u64		 mem_total;
30c60da22aSJiri Olsa 	u64		 mem_free;
31f854839bSJiri Olsa 	struct perf_cpu_map	*map;
32c60da22aSJiri Olsa };
33c60da22aSJiri Olsa 
34e2091cedSJiri Olsa struct memory_node {
35e2091cedSJiri Olsa 	u64		 node;
36e2091cedSJiri Olsa 	u64		 size;
37e2091cedSJiri Olsa 	unsigned long	*set;
38e2091cedSJiri Olsa };
39e2091cedSJiri Olsa 
40f0ce888cSArnaldo Carvalho de Melo struct perf_env {
41f0ce888cSArnaldo Carvalho de Melo 	char			*hostname;
42f0ce888cSArnaldo Carvalho de Melo 	char			*os_release;
43f0ce888cSArnaldo Carvalho de Melo 	char			*version;
44f0ce888cSArnaldo Carvalho de Melo 	char			*arch;
45f0ce888cSArnaldo Carvalho de Melo 	int			nr_cpus_online;
46f0ce888cSArnaldo Carvalho de Melo 	int			nr_cpus_avail;
47f0ce888cSArnaldo Carvalho de Melo 	char			*cpu_desc;
48f0ce888cSArnaldo Carvalho de Melo 	char			*cpuid;
49f0ce888cSArnaldo Carvalho de Melo 	unsigned long long	total_mem;
50e0838e02SKan Liang 	unsigned int		msr_pmu_type;
516f91ea28SKan Liang 	unsigned int		max_branches;
52f0ce888cSArnaldo Carvalho de Melo 
53f0ce888cSArnaldo Carvalho de Melo 	int			nr_cmdline;
54f0ce888cSArnaldo Carvalho de Melo 	int			nr_sibling_cores;
55acae8b36SKan Liang 	int			nr_sibling_dies;
56f0ce888cSArnaldo Carvalho de Melo 	int			nr_sibling_threads;
57f0ce888cSArnaldo Carvalho de Melo 	int			nr_numa_nodes;
58e2091cedSJiri Olsa 	int			nr_memory_nodes;
59f0ce888cSArnaldo Carvalho de Melo 	int			nr_pmu_mappings;
60f0ce888cSArnaldo Carvalho de Melo 	int			nr_groups;
616f91ea28SKan Liang 	int			nr_cpu_pmu_caps;
62f0ce888cSArnaldo Carvalho de Melo 	char			*cmdline;
63f0ce888cSArnaldo Carvalho de Melo 	const char		**cmdline_argv;
64f0ce888cSArnaldo Carvalho de Melo 	char			*sibling_cores;
65acae8b36SKan Liang 	char			*sibling_dies;
66f0ce888cSArnaldo Carvalho de Melo 	char			*sibling_threads;
67f0ce888cSArnaldo Carvalho de Melo 	char			*pmu_mappings;
686f91ea28SKan Liang 	char			*cpu_pmu_caps;
69f0ce888cSArnaldo Carvalho de Melo 	struct cpu_topology_map	*cpu;
70720e98b5SJiri Olsa 	struct cpu_cache_level	*caches;
71720e98b5SJiri Olsa 	int			 caches_cnt;
72d3c8c08eSAlexey Budankov 	u32			comp_ratio;
7342e1fd80SAlexey Budankov 	u32			comp_ver;
7442e1fd80SAlexey Budankov 	u32			comp_type;
7542e1fd80SAlexey Budankov 	u32			comp_level;
7642e1fd80SAlexey Budankov 	u32			comp_mmap_len;
77c60da22aSJiri Olsa 	struct numa_node	*numa_nodes;
78e2091cedSJiri Olsa 	struct memory_node	*memory_nodes;
79e2091cedSJiri Olsa 	unsigned long long	 memory_bsize;
80e4378f0cSSong Liu 
81e4378f0cSSong Liu 	/*
82e4378f0cSSong Liu 	 * bpf_info_lock protects bpf rbtrees. This is needed because the
83e4378f0cSSong Liu 	 * trees are accessed by different threads in perf-top
84e4378f0cSSong Liu 	 */
85e4378f0cSSong Liu 	struct {
86e4378f0cSSong Liu 		struct rw_semaphore	lock;
87e4378f0cSSong Liu 		struct rb_root		infos;
88e4378f0cSSong Liu 		u32			infos_cnt;
893792cb2fSSong Liu 		struct rb_root		btfs;
903792cb2fSSong Liu 		u32			btfs_cnt;
91e4378f0cSSong Liu 	} bpf_progs;
92389799a7SJiri Olsa 
93d1277aa3SNamhyung Kim 	/* same reason as above (for perf-top) */
94d1277aa3SNamhyung Kim 	struct {
95d1277aa3SNamhyung Kim 		struct rw_semaphore	lock;
96d1277aa3SNamhyung Kim 		struct rb_root		tree;
97d1277aa3SNamhyung Kim 	} cgroups;
98d1277aa3SNamhyung Kim 
99389799a7SJiri Olsa 	/* For fast cpu to numa node lookup via perf_env__numa_node */
100389799a7SJiri Olsa 	int			*numa_map;
101389799a7SJiri Olsa 	int			 nr_numa_map;
102d1e325cfSJiri Olsa 
103d1e325cfSJiri Olsa 	/* For real clock time reference. */
104d1e325cfSJiri Olsa 	struct {
105d1e325cfSJiri Olsa 		u64	tod_ns;
106d1e325cfSJiri Olsa 		u64	clockid_ns;
107*9d88a1a1SJiri Olsa 		u64     clockid_res_ns;
108d1e325cfSJiri Olsa 		int	clockid;
109d1e325cfSJiri Olsa 		/*
110d1e325cfSJiri Olsa 		 * enabled is valid for report mode, and is true if above
111d1e325cfSJiri Olsa 		 * values are set, it's set in process_clock_data
112d1e325cfSJiri Olsa 		 */
113d1e325cfSJiri Olsa 		bool	enabled;
114d1e325cfSJiri Olsa 	} clock;
115f0ce888cSArnaldo Carvalho de Melo };
116f0ce888cSArnaldo Carvalho de Melo 
11742e1fd80SAlexey Budankov enum perf_compress_type {
11842e1fd80SAlexey Budankov 	PERF_COMP_NONE = 0,
11942e1fd80SAlexey Budankov 	PERF_COMP_ZSTD,
12042e1fd80SAlexey Budankov 	PERF_COMP_MAX
12142e1fd80SAlexey Budankov };
12242e1fd80SAlexey Budankov 
123e4378f0cSSong Liu struct bpf_prog_info_node;
1243792cb2fSSong Liu struct btf_node;
125e4378f0cSSong Liu 
126b6998692SArnaldo Carvalho de Melo extern struct perf_env perf_env;
127b6998692SArnaldo Carvalho de Melo 
128f0ce888cSArnaldo Carvalho de Melo void perf_env__exit(struct perf_env *env);
129f0ce888cSArnaldo Carvalho de Melo 
130b6998692SArnaldo Carvalho de Melo int perf_env__set_cmdline(struct perf_env *env, int argc, const char *argv[]);
131b6998692SArnaldo Carvalho de Melo 
132f1cedfb8SArnaldo Carvalho de Melo int perf_env__read_cpuid(struct perf_env *env);
133aa36ddd7SArnaldo Carvalho de Melo int perf_env__read_cpu_topology_map(struct perf_env *env);
134aa36ddd7SArnaldo Carvalho de Melo 
135720e98b5SJiri Olsa void cpu_cache_level__free(struct cpu_cache_level *cache);
1364e8fbc1cSArnaldo Carvalho de Melo 
1374e8fbc1cSArnaldo Carvalho de Melo const char *perf_env__arch(struct perf_env *env);
138dbbd34a6SAdrian Hunter const char *perf_env__raw_arch(struct perf_env *env);
1399cecca32SAdrian Hunter int perf_env__nr_cpus_avail(struct perf_env *env);
140dbbd34a6SAdrian Hunter 
141e4378f0cSSong Liu void perf_env__init(struct perf_env *env);
142e4378f0cSSong Liu void perf_env__insert_bpf_prog_info(struct perf_env *env,
143e4378f0cSSong Liu 				    struct bpf_prog_info_node *info_node);
144e4378f0cSSong Liu struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env,
145e4378f0cSSong Liu 							__u32 prog_id);
1463792cb2fSSong Liu void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node);
1473792cb2fSSong Liu struct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id);
148389799a7SJiri Olsa 
149389799a7SJiri Olsa int perf_env__numa_node(struct perf_env *env, int cpu);
150f0ce888cSArnaldo Carvalho de Melo #endif /* __PERF_ENV_H */
151