xref: /openbmc/linux/tools/perf/util/evsel.h (revision df2634f43f5106947f3735a0b61a6527a4b278cd)
1 #ifndef __PERF_EVSEL_H
2 #define __PERF_EVSEL_H 1
3 
4 #include <linux/list.h>
5 #include <stdbool.h>
6 #include "../../../include/linux/perf_event.h"
7 #include "types.h"
8 #include "xyarray.h"
9 
10 struct perf_counts_values {
11 	union {
12 		struct {
13 			u64 val;
14 			u64 ena;
15 			u64 run;
16 		};
17 		u64 values[3];
18 	};
19 };
20 
21 struct perf_counts {
22 	s8		   	  scaled;
23 	struct perf_counts_values aggr;
24 	struct perf_counts_values cpu[];
25 };
26 
27 struct perf_evsel {
28 	struct list_head	node;
29 	struct perf_event_attr	attr;
30 	char			*filter;
31 	struct xyarray		*fd;
32 	struct perf_counts	*counts;
33 	int			idx;
34 	void			*priv;
35 };
36 
37 struct cpu_map;
38 struct thread_map;
39 
40 struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr, int idx);
41 void perf_evsel__delete(struct perf_evsel *evsel);
42 
43 int perf_evsel__alloc_fd(struct perf_evsel *evsel, int ncpus, int nthreads);
44 int perf_evsel__alloc_counts(struct perf_evsel *evsel, int ncpus);
45 void perf_evsel__free_fd(struct perf_evsel *evsel);
46 void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads);
47 
48 int perf_evsel__open_per_cpu(struct perf_evsel *evsel, struct cpu_map *cpus);
49 int perf_evsel__open_per_thread(struct perf_evsel *evsel, struct thread_map *threads);
50 int perf_evsel__open(struct perf_evsel *evsel,
51 		     struct cpu_map *cpus, struct thread_map *threads);
52 
53 #define perf_evsel__match(evsel, t, c)		\
54 	(evsel->attr.type == PERF_TYPE_##t &&	\
55 	 evsel->attr.config == PERF_COUNT_##c)
56 
57 int __perf_evsel__read_on_cpu(struct perf_evsel *evsel,
58 			      int cpu, int thread, bool scale);
59 
60 /**
61  * perf_evsel__read_on_cpu - Read out the results on a CPU and thread
62  *
63  * @evsel - event selector to read value
64  * @cpu - CPU of interest
65  * @thread - thread of interest
66  */
67 static inline int perf_evsel__read_on_cpu(struct perf_evsel *evsel,
68 					  int cpu, int thread)
69 {
70 	return __perf_evsel__read_on_cpu(evsel, cpu, thread, false);
71 }
72 
73 /**
74  * perf_evsel__read_on_cpu_scaled - Read out the results on a CPU and thread, scaled
75  *
76  * @evsel - event selector to read value
77  * @cpu - CPU of interest
78  * @thread - thread of interest
79  */
80 static inline int perf_evsel__read_on_cpu_scaled(struct perf_evsel *evsel,
81 						 int cpu, int thread)
82 {
83 	return __perf_evsel__read_on_cpu(evsel, cpu, thread, true);
84 }
85 
86 int __perf_evsel__read(struct perf_evsel *evsel, int ncpus, int nthreads,
87 		       bool scale);
88 
89 /**
90  * perf_evsel__read - Read the aggregate results on all CPUs
91  *
92  * @evsel - event selector to read value
93  * @ncpus - Number of cpus affected, from zero
94  * @nthreads - Number of threads affected, from zero
95  */
96 static inline int perf_evsel__read(struct perf_evsel *evsel,
97 				    int ncpus, int nthreads)
98 {
99 	return __perf_evsel__read(evsel, ncpus, nthreads, false);
100 }
101 
102 /**
103  * perf_evsel__read_scaled - Read the aggregate results on all CPUs, scaled
104  *
105  * @evsel - event selector to read value
106  * @ncpus - Number of cpus affected, from zero
107  * @nthreads - Number of threads affected, from zero
108  */
109 static inline int perf_evsel__read_scaled(struct perf_evsel *evsel,
110 					  int ncpus, int nthreads)
111 {
112 	return __perf_evsel__read(evsel, ncpus, nthreads, true);
113 }
114 
115 #endif /* __PERF_EVSEL_H */
116