xref: /openbmc/linux/tools/perf/util/stat.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
20007eceaSXiao Guangrong #ifndef __PERF_STATS_H
30007eceaSXiao Guangrong #define __PERF_STATS_H
40007eceaSXiao Guangrong 
5d944c4eeSBorislav Petkov #include <linux/types.h>
6f87027b9SJiri Olsa #include <stdio.h>
78897a891SJiri Olsa #include <sys/types.h>
88897a891SJiri Olsa #include <sys/resource.h>
92760f5a1SJames Clark #include "cpumap.h"
10e5fcc2abSJin Yao #include "rblist.h"
11ca68b374SNamhyung Kim #include "counts.h"
120007eceaSXiao Guangrong 
13b251892dSArnaldo Carvalho de Melo struct perf_cpu_map;
14b251892dSArnaldo Carvalho de Melo struct perf_stat_config;
1538b7b678SArnaldo Carvalho de Melo struct timespec;
1638b7b678SArnaldo Carvalho de Melo 
17e55c14afSJiri Olsa struct stats {
180007eceaSXiao Guangrong 	double n, mean, M2;
19ffe4f3c0SDavid Ahern 	u64 max, min;
200007eceaSXiao Guangrong };
210007eceaSXiao Guangrong 
22ca68b374SNamhyung Kim /* hold aggregated event info */
23ca68b374SNamhyung Kim struct perf_stat_aggr {
24ca68b374SNamhyung Kim 	/* aggregated values */
25ca68b374SNamhyung Kim 	struct perf_counts_values	counts;
26ca68b374SNamhyung Kim 	/* number of entries (CPUs) aggregated */
27ca68b374SNamhyung Kim 	int				nr;
28ca68b374SNamhyung Kim 	/* whether any entry has failed to read/process event */
29ca68b374SNamhyung Kim 	bool				failed;
301d6d2beaSNamhyung Kim 	/* to mark this data is processed already */
311d6d2beaSNamhyung Kim 	bool				used;
32ca68b374SNamhyung Kim };
33ca68b374SNamhyung Kim 
34ca68b374SNamhyung Kim /* per-evsel event stats */
35581cc8a2SJiri Olsa struct perf_stat_evsel {
36ca68b374SNamhyung Kim 	/* used for repeated runs */
3766b76e30SNamhyung Kim 	struct stats		 res_stats;
38ca68b374SNamhyung Kim 	/* number of allocated 'aggr' */
39ca68b374SNamhyung Kim 	int			 nr_aggr;
40ca68b374SNamhyung Kim 	/* aggregated event values */
41ca68b374SNamhyung Kim 	struct perf_stat_aggr	*aggr;
42ca68b374SNamhyung Kim 	/* used for group read */
43f7794d52SJiri Olsa 	u64			*group_data;
44e2f56da1SJiri Olsa };
45e2f56da1SJiri Olsa 
46f87027b9SJiri Olsa enum aggr_mode {
47f87027b9SJiri Olsa 	AGGR_NONE,
48f87027b9SJiri Olsa 	AGGR_GLOBAL,
49f87027b9SJiri Olsa 	AGGR_SOCKET,
50db5742b6SKan Liang 	AGGR_DIE,
51f87027b9SJiri Olsa 	AGGR_CACHE,
5232b8af82SJiri Olsa 	AGGR_CORE,
53208df99eSJiri Olsa 	AGGR_THREAD,
5486895b48SJiri Olsa 	AGGR_UNSET,
55df936cadSClaire Jensen 	AGGR_NODE,
56f87027b9SJiri Olsa 	AGGR_MAX
57f87027b9SJiri Olsa };
58c735b0a5SFlorian Fischer 
59c735b0a5SFlorian Fischer struct rusage_stats {
60c735b0a5SFlorian Fischer 	struct stats ru_utime_usec_stat;
61c735b0a5SFlorian Fischer 	struct stats ru_stime_usec_stat;
62c735b0a5SFlorian Fischer };
636d18804bSIan Rogers 
646f6b6594SJiri Olsa typedef struct aggr_cpu_id (*aggr_get_id_t)(struct perf_stat_config *config, struct perf_cpu cpu);
65421a50f3SJiri Olsa 
66421a50f3SJiri Olsa struct perf_stat_config {
67711a572eSJiri Olsa 	enum aggr_mode		 aggr_mode;
685698f26bSJiri Olsa 	u32			 aggr_level;
697d9ad16aSJiri Olsa 	bool			 scale;
70fa7070a3SJiri Olsa 	bool			 no_inherit;
71df936cadSClaire Jensen 	bool			 identifier;
72132c6ba3SJiri Olsa 	bool			 csv_output;
730ce5aa02SJiri Olsa 	bool			 json_output;
74aea0dca1SJiri Olsa 	bool			 interval_clear;
758897a891SJiri Olsa 	bool			 metric_only;
7634ff0866SJiri Olsa 	bool			 null_run;
77fdee335bSJiri Olsa 	bool			 ru_display;
782c8e6451SZhengjun Xing 	bool			 big_num;
7954ac0b1bSJiri Olsa 	bool			 no_merge;
80dd071024SJin Yao 	bool			 hybrid_merge;
81dd071024SJin Yao 	bool			 walltime_run_table;
821af62ce6SJin Yao 	bool			 all_kernel;
83c7e5b328SJin Yao 	bool			 all_user;
840bdad978SJin Yao 	bool			 percore_show_thread;
8505530a79SIan Rogers 	bool			 summary;
8605530a79SIan Rogers 	bool			 no_csv_summary;
871fd09e29SIan Rogers 	bool			 metric_no_group;
88ee6a9614SJin Yao 	bool			 metric_no_merge;
89f07952b1SAlexander Antonov 	bool			 metric_no_threshold;
901725e9cdSIan Rogers 	bool			 stop_read_counter;
911725e9cdSIan Rogers 	bool			 iostat_run;
925821522eSJiri Olsa 	char			 *user_requested_cpu_list;
93ec0d3d1fSJiri Olsa 	bool			 system_wide;
94f1f8ad52Syuzhoujian 	FILE			*output;
95df4f7b4dSJiri Olsa 	unsigned int		 interval;
96ee1760e2SJiri Olsa 	unsigned int		 timeout;
97db06a269Syuzhoujian 	unsigned int		 unit_width;
98d97ae04bSJiri Olsa 	unsigned int		 metric_only_len;
9931084123SJiri Olsa 	int			 times;
1003b3cd9a4SJiri Olsa 	int			 run_count;
101fa7070a3SJiri Olsa 	int			 print_free_counters_hint;
10226893a60SJiri Olsa 	int			 print_mixed_hw_group_error;
1038897a891SJiri Olsa 	const char		*csv_sep;
104c735b0a5SFlorian Fischer 	struct stats		*walltime_nsecs_stats;
105d526e1a0SJames Clark 	struct rusage		 ru_data;
1066f6b6594SJiri Olsa 	struct rusage_stats		 *ru_stats;
107d526e1a0SJames Clark 	struct cpu_aggr_map	*aggr_map;
10854ac0b1bSJiri Olsa 	aggr_get_id_t		 aggr_get_id;
109d0192fdbSJiri Olsa 	struct cpu_aggr_map	*cpus_aggr_map;
11027e9769aSAlexey Budankov 	u64			*walltime_run;
11127e9769aSAlexey Budankov 	struct rblist		 metric_events;
112a8fcbd26SAdrian Hunter 	int			 ctl_fd;
113d1c5a0e8SNamhyung Kim 	int			 ctl_fd_ack;
11463e39aa6SKan Liang 	bool			 ctl_fd_close;
115421a50f3SJiri Olsa 	const char		*cgroup_list;
116421a50f3SJiri Olsa 	unsigned int		topdown_level;
117d778a778SPaul A. Clarke };
1180bdad978SJin Yao 
119d778a778SPaul A. Clarke void perf_stat__set_big_num(int set);
1200007eceaSXiao Guangrong void perf_stat__set_no_csv_summary(int set);
1210007eceaSXiao Guangrong 
1220007eceaSXiao Guangrong void update_stats(struct stats *stats, u64 val);
1230007eceaSXiao Guangrong double avg_stats(struct stats *stats);
1240007eceaSXiao Guangrong double stddev_stats(struct stats *stats);
125ffe4f3c0SDavid Ahern double rel_stddev_stats(double stddev, double avg);
126ffe4f3c0SDavid Ahern 
init_stats(struct stats * stats)127ffe4f3c0SDavid Ahern static inline void init_stats(struct stats *stats)
128ffe4f3c0SDavid Ahern {
129ffe4f3c0SDavid Ahern 	stats->n    = 0.0;
130ffe4f3c0SDavid Ahern 	stats->mean = 0.0;
131ffe4f3c0SDavid Ahern 	stats->M2   = 0.0;
132ffe4f3c0SDavid Ahern 	stats->min  = (u64) -1;
133e2f56da1SJiri Olsa 	stats->max  = 0;
134c735b0a5SFlorian Fischer }
135c735b0a5SFlorian Fischer 
init_rusage_stats(struct rusage_stats * ru_stats)136c735b0a5SFlorian Fischer static inline void init_rusage_stats(struct rusage_stats *ru_stats) {
137c735b0a5SFlorian Fischer 	init_stats(&ru_stats->ru_utime_usec_stat);
138c735b0a5SFlorian Fischer 	init_stats(&ru_stats->ru_stime_usec_stat);
139c735b0a5SFlorian Fischer }
140c735b0a5SFlorian Fischer 
update_rusage_stats(struct rusage_stats * ru_stats,struct rusage * rusage)141c735b0a5SFlorian Fischer static inline void update_rusage_stats(struct rusage_stats *ru_stats, struct rusage* rusage) {
142c735b0a5SFlorian Fischer 	const u64 us_to_ns = 1000;
143c735b0a5SFlorian Fischer 	const u64 s_to_ns = 1000000000;
144c735b0a5SFlorian Fischer 	update_stats(&ru_stats->ru_utime_usec_stat,
145c735b0a5SFlorian Fischer 	             (rusage->ru_utime.tv_usec * us_to_ns + rusage->ru_utime.tv_sec * s_to_ns));
146c735b0a5SFlorian Fischer 	update_stats(&ru_stats->ru_stime_usec_stat,
147c735b0a5SFlorian Fischer 	             (rusage->ru_stime.tv_usec * us_to_ns + rusage->ru_stime.tv_sec * s_to_ns));
14832dcd021SJiri Olsa }
14963503dbaSJiri Olsa 
15024e34f68SJiri Olsa struct evsel;
151f87027b9SJiri Olsa struct evlist;
152c735b0a5SFlorian Fischer 
153f87027b9SJiri Olsa extern struct stats walltime_nsecs_stats;
1546ca9a082SJiri Olsa extern struct rusage_stats ru_stats;
1556ca9a082SJiri Olsa 
156140aeadcSAndi Kleen typedef void (*print_metric_t)(struct perf_stat_config *config,
1576ca9a082SJiri Olsa 			       void *ctx, const char *color, const char *unit,
158140aeadcSAndi Kleen 			       const char *fmt, double val);
159f87027b9SJiri Olsa typedef void (*new_line_t)(struct perf_stat_config *config, void *ctx);
160140aeadcSAndi Kleen 
161140aeadcSAndi Kleen /* Used to print the display name of the Default metricgroup for now. */
162140aeadcSAndi Kleen typedef void (*print_metricgroup_header_t)(struct perf_stat_config *config,
163140aeadcSAndi Kleen 					   void *ctx, const char *metricgroup_name);
16437932c18SAndi Kleen 
165140aeadcSAndi Kleen void perf_stat__reset_shadow_stats(void);
166140aeadcSAndi Kleen struct perf_stat_output_ctx {
1676ca9a082SJiri Olsa 	void *ctx;
16832dcd021SJiri Olsa 	print_metric_t print_metric;
169*8945bef3SIan Rogers 	new_line_t new_line;
170b18f3e36SAndi Kleen 	print_metricgroup_header_t print_metricgroup_header;
171cc26ffaaSIan Rogers 	bool force_header;
172f87027b9SJiri Olsa };
1731f297a6eSNamhyung Kim 
1741f297a6eSNamhyung Kim void perf_stat__print_shadow_stats(struct perf_stat_config *config,
17553f5e908SArnaldo Carvalho de Melo 				   struct evsel *evsel,
17653f5e908SArnaldo Carvalho de Melo 				   double avg, int aggr_idx,
17753f5e908SArnaldo Carvalho de Melo 				   struct perf_stat_output_ctx *out,
17853f5e908SArnaldo Carvalho de Melo 				   struct rblist *metric_events);
17953f5e908SArnaldo Carvalho de Melo bool perf_stat__skip_metric_event(struct evsel *evsel,
180f80010ebSJiri Olsa 				  struct rblist *metric_events,
181ae7e6492SNamhyung Kim 				  u64 ena, u64 run);
1828f97963eSNamhyung Kim void *perf_stat__print_shadow_stats_metricgroup(struct perf_stat_config *config,
183ae7e6492SNamhyung Kim 						struct evsel *evsel,
184f80010ebSJiri Olsa 						int aggr_idx,
18532dcd021SJiri Olsa 						int *num,
186942c5593SNamhyung Kim 						void *from,
1871d6d2beaSNamhyung Kim 						struct perf_stat_output_ctx *out,
188942c5593SNamhyung Kim 						struct rblist *metric_events);
1890ea0e355SJiri Olsa 
1900ea0e355SJiri Olsa int evlist__alloc_stats(struct perf_stat_config *config,
1910ea0e355SJiri Olsa 			struct evlist *evlist, bool alloc_raw);
192aeb00b1aSArnaldo Carvalho de Melo void evlist__free_stats(struct evlist *evlist);
193aeb00b1aSArnaldo Carvalho de Melo void evlist__reset_stats(struct evlist *evlist);
19489f1688aSJiri Olsa void evlist__reset_prev_raw_counts(struct evlist *evlist);
19589f1688aSJiri Olsa void evlist__copy_prev_raw_counts(struct evlist *evlist);
196e08a4564SJiri Olsa void evlist__save_aggr_prev_raw_counts(struct evlist *evlist);
197e08a4564SJiri Olsa 
198e08a4564SJiri Olsa int evlist__alloc_aggr_stats(struct evlist *evlist, int nr_aggr);
199e08a4564SJiri Olsa void evlist__reset_aggr_stats(struct evlist *evlist);
200d09cefd2SJiri Olsa void evlist__copy_res_stats(struct perf_stat_config *config, struct evlist *evlist);
20132dcd021SJiri Olsa 
202d09cefd2SJiri Olsa int perf_stat_process_counter(struct perf_stat_config *config,
2034804e011SAndi Kleen 			      struct evsel *counter);
2046f844b1fSIan Rogers void perf_stat_merge_counters(struct perf_stat_config *config, struct evlist *evlist);
20571273724SArnaldo Carvalho de Melo void perf_stat_process_percore(struct perf_stat_config *config, struct evlist *evlist);
20671273724SArnaldo Carvalho de Melo 
2076d432c4cSJiri Olsa struct perf_tool;
2086d432c4cSJiri Olsa union perf_event;
209*8945bef3SIan Rogers struct perf_session;
2100007eceaSXiao Guangrong struct target;
211 
212 int perf_event__process_stat_event(struct perf_session *session,
213 				   union perf_event *event);
214 
215 size_t perf_event__fprintf_stat(union perf_event *event, FILE *fp);
216 size_t perf_event__fprintf_stat_round(union perf_event *event, FILE *fp);
217 size_t perf_event__fprintf_stat_config(union perf_event *event, FILE *fp);
218 
219 int create_perf_stat_counter(struct evsel *evsel,
220 			     struct perf_stat_config *config,
221 			     struct target *target,
222 			     int cpu_map_idx);
223 void evlist__print_counters(struct evlist *evlist, struct perf_stat_config *config,
224 			    struct target *_target, struct timespec *ts, int argc, const char **argv);
225 
226 struct metric_expr;
227 double test_generic_metric(struct metric_expr *mexp, int aggr_idx);
228 #endif
229