1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __PERF_STATS_H 3 #define __PERF_STATS_H 4 5 #include <linux/types.h> 6 #include <stdio.h> 7 #include <sys/types.h> 8 #include <sys/time.h> 9 #include <sys/resource.h> 10 #include <sys/wait.h> 11 #include "xyarray.h" 12 #include "rblist.h" 13 #include "perf.h" 14 #include "event.h" 15 16 struct stats { 17 double n, mean, M2; 18 u64 max, min; 19 }; 20 21 enum perf_stat_evsel_id { 22 PERF_STAT_EVSEL_ID__NONE = 0, 23 PERF_STAT_EVSEL_ID__CYCLES_IN_TX, 24 PERF_STAT_EVSEL_ID__TRANSACTION_START, 25 PERF_STAT_EVSEL_ID__ELISION_START, 26 PERF_STAT_EVSEL_ID__CYCLES_IN_TX_CP, 27 PERF_STAT_EVSEL_ID__TOPDOWN_TOTAL_SLOTS, 28 PERF_STAT_EVSEL_ID__TOPDOWN_SLOTS_ISSUED, 29 PERF_STAT_EVSEL_ID__TOPDOWN_SLOTS_RETIRED, 30 PERF_STAT_EVSEL_ID__TOPDOWN_FETCH_BUBBLES, 31 PERF_STAT_EVSEL_ID__TOPDOWN_RECOVERY_BUBBLES, 32 PERF_STAT_EVSEL_ID__SMI_NUM, 33 PERF_STAT_EVSEL_ID__APERF, 34 PERF_STAT_EVSEL_ID__MAX, 35 }; 36 37 struct perf_stat_evsel { 38 struct stats res_stats[3]; 39 enum perf_stat_evsel_id id; 40 u64 *group_data; 41 }; 42 43 enum aggr_mode { 44 AGGR_NONE, 45 AGGR_GLOBAL, 46 AGGR_SOCKET, 47 AGGR_CORE, 48 AGGR_THREAD, 49 AGGR_UNSET, 50 }; 51 52 enum { 53 CTX_BIT_USER = 1 << 0, 54 CTX_BIT_KERNEL = 1 << 1, 55 CTX_BIT_HV = 1 << 2, 56 CTX_BIT_HOST = 1 << 3, 57 CTX_BIT_IDLE = 1 << 4, 58 CTX_BIT_MAX = 1 << 5, 59 }; 60 61 #define NUM_CTX CTX_BIT_MAX 62 63 enum stat_type { 64 STAT_NONE = 0, 65 STAT_NSECS, 66 STAT_CYCLES, 67 STAT_STALLED_CYCLES_FRONT, 68 STAT_STALLED_CYCLES_BACK, 69 STAT_BRANCHES, 70 STAT_CACHEREFS, 71 STAT_L1_DCACHE, 72 STAT_L1_ICACHE, 73 STAT_LL_CACHE, 74 STAT_ITLB_CACHE, 75 STAT_DTLB_CACHE, 76 STAT_CYCLES_IN_TX, 77 STAT_TRANSACTION, 78 STAT_ELISION, 79 STAT_TOPDOWN_TOTAL_SLOTS, 80 STAT_TOPDOWN_SLOTS_ISSUED, 81 STAT_TOPDOWN_SLOTS_RETIRED, 82 STAT_TOPDOWN_FETCH_BUBBLES, 83 STAT_TOPDOWN_RECOVERY_BUBBLES, 84 STAT_SMI_NUM, 85 STAT_APERF, 86 STAT_MAX 87 }; 88 89 struct runtime_stat { 90 struct rblist value_list; 91 }; 92 93 typedef int (*aggr_get_id_t)(struct perf_stat_config *config, 94 struct cpu_map *m, int cpu); 95 96 struct perf_stat_config { 97 enum aggr_mode aggr_mode; 98 bool scale; 99 bool no_inherit; 100 bool identifier; 101 bool csv_output; 102 bool interval_clear; 103 bool metric_only; 104 bool null_run; 105 bool ru_display; 106 bool big_num; 107 bool no_merge; 108 bool walltime_run_table; 109 FILE *output; 110 unsigned int interval; 111 unsigned int timeout; 112 unsigned int initial_delay; 113 unsigned int unit_width; 114 unsigned int metric_only_len; 115 int times; 116 int run_count; 117 int print_free_counters_hint; 118 int print_mixed_hw_group_error; 119 struct runtime_stat *stats; 120 int stats_num; 121 const char *csv_sep; 122 struct stats *walltime_nsecs_stats; 123 struct rusage ru_data; 124 struct cpu_map *aggr_map; 125 aggr_get_id_t aggr_get_id; 126 struct cpu_map *cpus_aggr_map; 127 u64 *walltime_run; 128 struct rblist metric_events; 129 }; 130 131 void update_stats(struct stats *stats, u64 val); 132 double avg_stats(struct stats *stats); 133 double stddev_stats(struct stats *stats); 134 double rel_stddev_stats(double stddev, double avg); 135 136 static inline void init_stats(struct stats *stats) 137 { 138 stats->n = 0.0; 139 stats->mean = 0.0; 140 stats->M2 = 0.0; 141 stats->min = (u64) -1; 142 stats->max = 0; 143 } 144 145 struct perf_evsel; 146 struct perf_evlist; 147 148 struct perf_aggr_thread_value { 149 struct perf_evsel *counter; 150 int id; 151 double uval; 152 u64 val; 153 u64 run; 154 u64 ena; 155 }; 156 157 bool __perf_evsel_stat__is(struct perf_evsel *evsel, 158 enum perf_stat_evsel_id id); 159 160 #define perf_stat_evsel__is(evsel, id) \ 161 __perf_evsel_stat__is(evsel, PERF_STAT_EVSEL_ID__ ## id) 162 163 extern struct runtime_stat rt_stat; 164 extern struct stats walltime_nsecs_stats; 165 166 typedef void (*print_metric_t)(struct perf_stat_config *config, 167 void *ctx, const char *color, const char *unit, 168 const char *fmt, double val); 169 typedef void (*new_line_t)(struct perf_stat_config *config, void *ctx); 170 171 void runtime_stat__init(struct runtime_stat *st); 172 void runtime_stat__exit(struct runtime_stat *st); 173 void perf_stat__init_shadow_stats(void); 174 void perf_stat__reset_shadow_stats(void); 175 void perf_stat__reset_shadow_per_stat(struct runtime_stat *st); 176 void perf_stat__update_shadow_stats(struct perf_evsel *counter, u64 count, 177 int cpu, struct runtime_stat *st); 178 struct perf_stat_output_ctx { 179 void *ctx; 180 print_metric_t print_metric; 181 new_line_t new_line; 182 bool force_header; 183 }; 184 185 void perf_stat__print_shadow_stats(struct perf_stat_config *config, 186 struct perf_evsel *evsel, 187 double avg, int cpu, 188 struct perf_stat_output_ctx *out, 189 struct rblist *metric_events, 190 struct runtime_stat *st); 191 void perf_stat__collect_metric_expr(struct perf_evlist *); 192 193 int perf_evlist__alloc_stats(struct perf_evlist *evlist, bool alloc_raw); 194 void perf_evlist__free_stats(struct perf_evlist *evlist); 195 void perf_evlist__reset_stats(struct perf_evlist *evlist); 196 197 int perf_stat_process_counter(struct perf_stat_config *config, 198 struct perf_evsel *counter); 199 struct perf_tool; 200 union perf_event; 201 struct perf_session; 202 int perf_event__process_stat_event(struct perf_session *session, 203 union perf_event *event); 204 205 size_t perf_event__fprintf_stat(union perf_event *event, FILE *fp); 206 size_t perf_event__fprintf_stat_round(union perf_event *event, FILE *fp); 207 size_t perf_event__fprintf_stat_config(union perf_event *event, FILE *fp); 208 209 int create_perf_stat_counter(struct perf_evsel *evsel, 210 struct perf_stat_config *config, 211 struct target *target); 212 int perf_stat_synthesize_config(struct perf_stat_config *config, 213 struct perf_tool *tool, 214 struct perf_evlist *evlist, 215 perf_event__handler_t process, 216 bool attrs); 217 void 218 perf_evlist__print_counters(struct perf_evlist *evlist, 219 struct perf_stat_config *config, 220 struct target *_target, 221 struct timespec *ts, 222 int argc, const char **argv); 223 #endif 224