1 /* SPDX-License-Identifier: GPL-2.0 */
5 #include <linux/types.h>
8 #include <sys/resource.h>
14 struct perf_stat_config
;
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 */
28 /* whether any entry has failed to read/process event */
30 /* to mark this data is processed already */
34 /* per-evsel event stats */
35 struct perf_stat_evsel
{
36 /* used for repeated runs */
37 struct stats res_stats
;
38 /* number of allocated 'aggr' */
40 /* aggregated event values */
41 struct perf_stat_aggr
*aggr
;
42 /* used for group read */
61 struct stats ru_utime_usec_stat
;
62 struct stats ru_stime_usec_stat
;
65 typedef struct aggr_cpu_id (*aggr_get_id_t
)(struct perf_stat_config
*config
, struct perf_cpu cpu
);
67 struct perf_stat_config
{
68 enum aggr_mode aggr_mode
;
81 bool walltime_run_table
;
84 bool percore_show_thread
;
89 bool metric_no_threshold
;
90 bool hardware_aware_grouping
;
91 bool stop_read_counter
;
93 char *user_requested_cpu_list
;
96 unsigned int interval
;
98 unsigned int unit_width
;
99 unsigned int metric_only_len
;
102 int print_free_counters_hint
;
103 int print_mixed_hw_group_error
;
105 struct stats
*walltime_nsecs_stats
;
106 struct rusage ru_data
;
107 struct rusage_stats
*ru_stats
;
108 struct cpu_aggr_map
*aggr_map
;
109 aggr_get_id_t aggr_get_id
;
110 struct cpu_aggr_map
*cpus_aggr_map
;
112 struct rblist metric_events
;
116 const char *cgroup_list
;
117 unsigned int topdown_level
;
120 void perf_stat__set_big_num(int set
);
121 void perf_stat__set_no_csv_summary(int set
);
123 void update_stats(struct stats
*stats
, u64 val
);
124 double avg_stats(struct stats
*stats
);
125 double stddev_stats(struct stats
*stats
);
126 double rel_stddev_stats(double stddev
, double avg
);
128 static inline void init_stats(struct stats
*stats
)
133 stats
->min
= (u64
) -1;
137 static inline void init_rusage_stats(struct rusage_stats
*ru_stats
) {
138 init_stats(&ru_stats
->ru_utime_usec_stat
);
139 init_stats(&ru_stats
->ru_stime_usec_stat
);
142 static inline void update_rusage_stats(struct rusage_stats
*ru_stats
, struct rusage
* rusage
) {
143 const u64 us_to_ns
= 1000;
144 const u64 s_to_ns
= 1000000000;
145 update_stats(&ru_stats
->ru_utime_usec_stat
,
146 (rusage
->ru_utime
.tv_usec
* us_to_ns
+ rusage
->ru_utime
.tv_sec
* s_to_ns
));
147 update_stats(&ru_stats
->ru_stime_usec_stat
,
148 (rusage
->ru_stime
.tv_usec
* us_to_ns
+ rusage
->ru_stime
.tv_sec
* s_to_ns
));
154 extern struct stats walltime_nsecs_stats
;
155 extern struct rusage_stats ru_stats
;
157 enum metric_threshold_classify
{
158 METRIC_THRESHOLD_UNKNOWN
,
159 METRIC_THRESHOLD_BAD
,
160 METRIC_THRESHOLD_NEARLY_BAD
,
161 METRIC_THRESHOLD_LESS_GOOD
,
162 METRIC_THRESHOLD_GOOD
,
164 const char *metric_threshold_classify__color(enum metric_threshold_classify thresh
);
166 typedef void (*print_metric_t
)(struct perf_stat_config
*config
,
168 enum metric_threshold_classify thresh
,
172 typedef void (*new_line_t
)(struct perf_stat_config
*config
, void *ctx
);
174 /* Used to print the display name of the Default metricgroup for now. */
175 typedef void (*print_metricgroup_header_t
)(struct perf_stat_config
*config
,
176 void *ctx
, const char *metricgroup_name
);
178 void perf_stat__reset_shadow_stats(void);
179 struct perf_stat_output_ctx
{
181 print_metric_t print_metric
;
183 print_metricgroup_header_t print_metricgroup_header
;
187 void perf_stat__print_shadow_stats(struct perf_stat_config
*config
,
189 double avg
, int aggr_idx
,
190 struct perf_stat_output_ctx
*out
,
191 struct rblist
*metric_events
);
192 bool perf_stat__skip_metric_event(struct evsel
*evsel
,
193 struct rblist
*metric_events
,
195 void *perf_stat__print_shadow_stats_metricgroup(struct perf_stat_config
*config
,
200 struct perf_stat_output_ctx
*out
,
201 struct rblist
*metric_events
);
203 int evlist__alloc_stats(struct perf_stat_config
*config
,
204 struct evlist
*evlist
, bool alloc_raw
);
205 void evlist__free_stats(struct evlist
*evlist
);
206 void evlist__reset_stats(struct evlist
*evlist
);
207 void evlist__reset_prev_raw_counts(struct evlist
*evlist
);
208 void evlist__copy_prev_raw_counts(struct evlist
*evlist
);
209 void evlist__save_aggr_prev_raw_counts(struct evlist
*evlist
);
211 int evlist__alloc_aggr_stats(struct evlist
*evlist
, int nr_aggr
);
212 void evlist__reset_aggr_stats(struct evlist
*evlist
);
213 void evlist__copy_res_stats(struct perf_stat_config
*config
, struct evlist
*evlist
);
215 int perf_stat_process_counter(struct perf_stat_config
*config
,
216 struct evsel
*counter
);
217 void perf_stat_merge_counters(struct perf_stat_config
*config
, struct evlist
*evlist
);
218 void perf_stat_process_percore(struct perf_stat_config
*config
, struct evlist
*evlist
);
225 int perf_event__process_stat_event(struct perf_session
*session
,
226 union perf_event
*event
);
228 size_t perf_event__fprintf_stat(union perf_event
*event
, FILE *fp
);
229 size_t perf_event__fprintf_stat_round(union perf_event
*event
, FILE *fp
);
230 size_t perf_event__fprintf_stat_config(union perf_event
*event
, FILE *fp
);
232 int create_perf_stat_counter(struct evsel
*evsel
,
233 struct perf_stat_config
*config
,
234 struct target
*target
,
236 void evlist__print_counters(struct evlist
*evlist
, struct perf_stat_config
*config
,
237 struct target
*_target
, struct timespec
*ts
, int argc
, const char **argv
);
240 double test_generic_metric(struct metric_expr
*mexp
, int aggr_idx
);