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