xref: /linux/tools/perf/util/cputopo.h (revision cbdb1f163af2bb90d01be1f0263df1d8d5c9d9d3)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __PERF_CPUTOPO_H
3 #define __PERF_CPUTOPO_H
4 
5 #include <linux/types.h>
6 
7 struct cpu_topology {
8 	/* The number of unique package_cpus_lists below. */
9 	u32	  package_cpus_lists;
10 	/* The number of unique die_cpu_lists below. */
11 	u32	  die_cpus_lists;
12 	/* The number of unique core_cpu_lists below. */
13 	u32	  core_cpus_lists;
14 	/*
15 	 * An array of strings where each string is unique and read from
16 	 * /sys/devices/system/cpu/cpuX/topology/package_cpus_list. From the ABI
17 	 * each of these is a human-readable list of CPUs sharing the same
18 	 * physical_package_id. The format is like 0-3, 8-11, 14,17.
19 	 */
20 	const char **package_cpus_list;
21 	/*
22 	 * An array of string where each string is unique and from
23 	 * /sys/devices/system/cpu/cpuX/topology/die_cpus_list. From the ABI
24 	 * each of these is a human-readable list of CPUs within the same die.
25 	 * The format is like 0-3, 8-11, 14,17.
26 	 */
27 	const char **die_cpus_list;
28 	/*
29 	 * An array of string where each string is unique and from
30 	 * /sys/devices/system/cpu/cpuX/topology/core_cpus_list. From the ABI
31 	 * each of these is a human-readable list of CPUs within the same
32 	 * core. The format is like 0-3, 8-11, 14,17.
33 	 */
34 	const char **core_cpus_list;
35 };
36 
37 struct numa_topology_node {
38 	char		*cpus;
39 	u32		 node;
40 	u64		 mem_total;
41 	u64		 mem_free;
42 };
43 
44 struct numa_topology {
45 	u32				nr;
46 	struct numa_topology_node	nodes[];
47 };
48 
49 struct hybrid_topology_node {
50 	char		*pmu_name;
51 	char		*cpus;
52 };
53 
54 struct hybrid_topology {
55 	u32				nr;
56 	struct hybrid_topology_node	nodes[];
57 };
58 
59 struct cpu_topology *cpu_topology__new(void);
60 void cpu_topology__delete(struct cpu_topology *tp);
61 /* Determine from the core list whether SMT was enabled. */
62 bool cpu_topology__smt_on(const struct cpu_topology *topology);
63 /* Are the sets of SMT siblings all enabled or all disabled in user_requested_cpus. */
64 bool cpu_topology__core_wide(const struct cpu_topology *topology,
65 			     const char *user_requested_cpu_list);
66 
67 struct numa_topology *numa_topology__new(void);
68 void numa_topology__delete(struct numa_topology *tp);
69 
70 struct hybrid_topology *hybrid_topology__new(void);
71 void hybrid_topology__delete(struct hybrid_topology *tp);
72 
73 #endif /* __PERF_CPUTOPO_H */
74