Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
0007ecea XG |
2 | #ifndef __PERF_STATS_H |
3 | #define __PERF_STATS_H | |
4 | ||
d944c4ee | 5 | #include <linux/types.h> |
f87027b9 | 6 | #include <stdio.h> |
8897a891 | 7 | #include <sys/types.h> |
8897a891 | 8 | #include <sys/resource.h> |
2760f5a1 | 9 | #include "cpumap.h" |
e5fcc2ab | 10 | #include "rblist.h" |
ca68b374 | 11 | #include "counts.h" |
0007ecea | 12 | |
b251892d ACM |
13 | struct perf_cpu_map; |
14 | struct perf_stat_config; | |
38b7b678 ACM |
15 | struct timespec; |
16 | ||
e55c14af | 17 | struct stats { |
0007ecea | 18 | double n, mean, M2; |
ffe4f3c0 | 19 | u64 max, min; |
0007ecea XG |
20 | }; |
21 | ||
ca68b374 NK |
22 | /* hold aggregated event info */ |
23 | struct perf_stat_aggr { | |
24 | /* aggregated values */ | |
25 | struct perf_counts_values counts; | |
26 | /* number of entries (CPUs) aggregated */ | |
27 | int nr; | |
28 | /* whether any entry has failed to read/process event */ | |
29 | bool failed; | |
1d6d2bea NK |
30 | /* to mark this data is processed already */ |
31 | bool used; | |
ca68b374 NK |
32 | }; |
33 | ||
34 | /* per-evsel event stats */ | |
581cc8a2 | 35 | struct perf_stat_evsel { |
ca68b374 | 36 | /* used for repeated runs */ |
66b76e30 | 37 | struct stats res_stats; |
ca68b374 NK |
38 | /* number of allocated 'aggr' */ |
39 | int nr_aggr; | |
40 | /* aggregated event values */ | |
41 | struct perf_stat_aggr *aggr; | |
42 | /* used for group read */ | |
f7794d52 | 43 | u64 *group_data; |
e2f56da1 JO |
44 | }; |
45 | ||
f87027b9 JO |
46 | enum aggr_mode { |
47 | AGGR_NONE, | |
48 | AGGR_GLOBAL, | |
49 | AGGR_SOCKET, | |
db5742b6 | 50 | AGGR_DIE, |
cbc917a1 | 51 | AGGR_CLUSTER, |
995ed074 | 52 | AGGR_CACHE, |
f87027b9 | 53 | AGGR_CORE, |
32b8af82 | 54 | AGGR_THREAD, |
208df99e | 55 | AGGR_UNSET, |
86895b48 | 56 | AGGR_NODE, |
df936cad | 57 | AGGR_MAX |
f87027b9 JO |
58 | }; |
59 | ||
c735b0a5 FF |
60 | struct rusage_stats { |
61 | struct stats ru_utime_usec_stat; | |
62 | struct stats ru_stime_usec_stat; | |
63 | }; | |
64 | ||
6d18804b | 65 | typedef struct aggr_cpu_id (*aggr_get_id_t)(struct perf_stat_config *config, struct perf_cpu cpu); |
6f6b6594 | 66 | |
421a50f3 | 67 | struct perf_stat_config { |
728c0ee0 | 68 | enum aggr_mode aggr_mode; |
995ed074 | 69 | u32 aggr_level; |
728c0ee0 | 70 | bool scale; |
5698f26b | 71 | bool no_inherit; |
7d9ad16a | 72 | bool identifier; |
fa7070a3 | 73 | bool csv_output; |
df936cad | 74 | bool json_output; |
132c6ba3 | 75 | bool interval_clear; |
0ce5aa02 | 76 | bool metric_only; |
aea0dca1 | 77 | bool null_run; |
8897a891 | 78 | bool ru_display; |
34ff0866 | 79 | bool big_num; |
2c8e6451 | 80 | bool hybrid_merge; |
54ac0b1b | 81 | bool walltime_run_table; |
dd071024 JY |
82 | bool all_kernel; |
83 | bool all_user; | |
1af62ce6 | 84 | bool percore_show_thread; |
c7e5b328 | 85 | bool summary; |
0bdad978 | 86 | bool no_csv_summary; |
05530a79 IR |
87 | bool metric_no_group; |
88 | bool metric_no_merge; | |
1fd09e29 | 89 | bool metric_no_threshold; |
ee6a9614 | 90 | bool stop_read_counter; |
f07952b1 | 91 | bool iostat_run; |
1725e9cd IR |
92 | char *user_requested_cpu_list; |
93 | bool system_wide; | |
728c0ee0 JO |
94 | FILE *output; |
95 | unsigned int interval; | |
96 | unsigned int timeout; | |
df4f7b4d | 97 | unsigned int unit_width; |
ee1760e2 | 98 | unsigned int metric_only_len; |
728c0ee0 | 99 | int times; |
d97ae04b | 100 | int run_count; |
31084123 | 101 | int print_free_counters_hint; |
3b3cd9a4 | 102 | int print_mixed_hw_group_error; |
fa7070a3 | 103 | const char *csv_sep; |
26893a60 | 104 | struct stats *walltime_nsecs_stats; |
8897a891 | 105 | struct rusage ru_data; |
c735b0a5 | 106 | struct rusage_stats *ru_stats; |
d526e1a0 | 107 | struct cpu_aggr_map *aggr_map; |
6f6b6594 | 108 | aggr_get_id_t aggr_get_id; |
d526e1a0 | 109 | struct cpu_aggr_map *cpus_aggr_map; |
54ac0b1b | 110 | u64 *walltime_run; |
d0192fdb | 111 | struct rblist metric_events; |
27e9769a AB |
112 | int ctl_fd; |
113 | int ctl_fd_ack; | |
a8fcbd26 | 114 | bool ctl_fd_close; |
d1c5a0e8 | 115 | const char *cgroup_list; |
63e39aa6 | 116 | unsigned int topdown_level; |
421a50f3 JO |
117 | }; |
118 | ||
d778a778 | 119 | void perf_stat__set_big_num(int set); |
0bdad978 | 120 | void perf_stat__set_no_csv_summary(int set); |
d778a778 | 121 | |
0007ecea XG |
122 | void update_stats(struct stats *stats, u64 val); |
123 | double avg_stats(struct stats *stats); | |
124 | double stddev_stats(struct stats *stats); | |
125 | double rel_stddev_stats(double stddev, double avg); | |
126 | ||
ffe4f3c0 DA |
127 | static inline void init_stats(struct stats *stats) |
128 | { | |
129 | stats->n = 0.0; | |
130 | stats->mean = 0.0; | |
131 | stats->M2 = 0.0; | |
132 | stats->min = (u64) -1; | |
133 | stats->max = 0; | |
134 | } | |
e2f56da1 | 135 | |
c735b0a5 FF |
136 | static inline void init_rusage_stats(struct rusage_stats *ru_stats) { |
137 | init_stats(&ru_stats->ru_utime_usec_stat); | |
138 | init_stats(&ru_stats->ru_stime_usec_stat); | |
139 | } | |
140 | ||
141 | static inline void update_rusage_stats(struct rusage_stats *ru_stats, struct rusage* rusage) { | |
142 | const u64 us_to_ns = 1000; | |
143 | const u64 s_to_ns = 1000000000; | |
144 | update_stats(&ru_stats->ru_utime_usec_stat, | |
145 | (rusage->ru_utime.tv_usec * us_to_ns + rusage->ru_utime.tv_sec * s_to_ns)); | |
146 | update_stats(&ru_stats->ru_stime_usec_stat, | |
147 | (rusage->ru_stime.tv_usec * us_to_ns + rusage->ru_stime.tv_sec * s_to_ns)); | |
148 | } | |
149 | ||
32dcd021 | 150 | struct evsel; |
63503dba | 151 | struct evlist; |
24e34f68 | 152 | |
f87027b9 | 153 | extern struct stats walltime_nsecs_stats; |
c735b0a5 | 154 | extern struct rusage_stats ru_stats; |
f87027b9 | 155 | |
6ca9a082 JO |
156 | typedef void (*print_metric_t)(struct perf_stat_config *config, |
157 | void *ctx, const char *color, const char *unit, | |
140aeadc | 158 | const char *fmt, double val); |
6ca9a082 | 159 | typedef void (*new_line_t)(struct perf_stat_config *config, void *ctx); |
140aeadc | 160 | |
6a80d794 KL |
161 | /* Used to print the display name of the Default metricgroup for now. */ |
162 | typedef void (*print_metricgroup_header_t)(struct perf_stat_config *config, | |
163 | void *ctx, const char *metricgroup_name); | |
164 | ||
f87027b9 | 165 | void perf_stat__reset_shadow_stats(void); |
140aeadc AK |
166 | struct perf_stat_output_ctx { |
167 | void *ctx; | |
168 | print_metric_t print_metric; | |
169 | new_line_t new_line; | |
6a80d794 | 170 | print_metricgroup_header_t print_metricgroup_header; |
37932c18 | 171 | bool force_header; |
140aeadc AK |
172 | }; |
173 | ||
6ca9a082 | 174 | void perf_stat__print_shadow_stats(struct perf_stat_config *config, |
32dcd021 | 175 | struct evsel *evsel, |
8945bef3 | 176 | double avg, int aggr_idx, |
b18f3e36 | 177 | struct perf_stat_output_ctx *out, |
cc26ffaa | 178 | struct rblist *metric_events); |
6a80d794 KL |
179 | bool perf_stat__skip_metric_event(struct evsel *evsel, |
180 | struct rblist *metric_events, | |
181 | u64 ena, u64 run); | |
182 | void *perf_stat__print_shadow_stats_metricgroup(struct perf_stat_config *config, | |
183 | struct evsel *evsel, | |
184 | int aggr_idx, | |
185 | int *num, | |
186 | void *from, | |
187 | struct perf_stat_output_ctx *out, | |
188 | struct rblist *metric_events); | |
f87027b9 | 189 | |
1f297a6e NK |
190 | int evlist__alloc_stats(struct perf_stat_config *config, |
191 | struct evlist *evlist, bool alloc_raw); | |
53f5e908 ACM |
192 | void evlist__free_stats(struct evlist *evlist); |
193 | void evlist__reset_stats(struct evlist *evlist); | |
194 | void evlist__reset_prev_raw_counts(struct evlist *evlist); | |
195 | void evlist__copy_prev_raw_counts(struct evlist *evlist); | |
196 | void evlist__save_aggr_prev_raw_counts(struct evlist *evlist); | |
f80010eb | 197 | |
ae7e6492 | 198 | int evlist__alloc_aggr_stats(struct evlist *evlist, int nr_aggr); |
8f97963e | 199 | void evlist__reset_aggr_stats(struct evlist *evlist); |
dada1a1f | 200 | void evlist__copy_res_stats(struct perf_stat_config *config, struct evlist *evlist); |
ae7e6492 | 201 | |
f80010eb | 202 | int perf_stat_process_counter(struct perf_stat_config *config, |
32dcd021 | 203 | struct evsel *counter); |
942c5593 | 204 | void perf_stat_merge_counters(struct perf_stat_config *config, struct evlist *evlist); |
1d6d2bea | 205 | void perf_stat_process_percore(struct perf_stat_config *config, struct evlist *evlist); |
942c5593 | 206 | |
0ea0e355 JO |
207 | struct perf_tool; |
208 | union perf_event; | |
209 | struct perf_session; | |
aeb00b1a ACM |
210 | struct target; |
211 | ||
89f1688a JO |
212 | int perf_event__process_stat_event(struct perf_session *session, |
213 | union perf_event *event); | |
e08a4564 JO |
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); | |
d09cefd2 | 218 | |
32dcd021 | 219 | int create_perf_stat_counter(struct evsel *evsel, |
d09cefd2 | 220 | struct perf_stat_config *config, |
4804e011 | 221 | struct target *target, |
6f844b1f | 222 | int cpu_map_idx); |
71273724 ACM |
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); | |
6d432c4c JO |
225 | |
226 | struct metric_expr; | |
8945bef3 | 227 | double test_generic_metric(struct metric_expr *mexp, int aggr_idx); |
0007ecea | 228 | #endif |