linux/tools/perf/util/stat.h
<<
>>
Prefs
   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/resource.h>
   9#include "cpumap.h"
  10#include "rblist.h"
  11
  12struct perf_cpu_map;
  13struct perf_stat_config;
  14struct timespec;
  15
  16struct stats {
  17        double n, mean, M2;
  18        u64 max, min;
  19};
  20
  21enum 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__TOPDOWN_RETIRING,
  33        PERF_STAT_EVSEL_ID__TOPDOWN_BAD_SPEC,
  34        PERF_STAT_EVSEL_ID__TOPDOWN_FE_BOUND,
  35        PERF_STAT_EVSEL_ID__TOPDOWN_BE_BOUND,
  36        PERF_STAT_EVSEL_ID__TOPDOWN_HEAVY_OPS,
  37        PERF_STAT_EVSEL_ID__TOPDOWN_BR_MISPREDICT,
  38        PERF_STAT_EVSEL_ID__TOPDOWN_FETCH_LAT,
  39        PERF_STAT_EVSEL_ID__TOPDOWN_MEM_BOUND,
  40        PERF_STAT_EVSEL_ID__SMI_NUM,
  41        PERF_STAT_EVSEL_ID__APERF,
  42        PERF_STAT_EVSEL_ID__MAX,
  43};
  44
  45struct perf_stat_evsel {
  46        struct stats             res_stats[3];
  47        enum perf_stat_evsel_id  id;
  48        u64                     *group_data;
  49};
  50
  51enum aggr_mode {
  52        AGGR_NONE,
  53        AGGR_GLOBAL,
  54        AGGR_SOCKET,
  55        AGGR_DIE,
  56        AGGR_CORE,
  57        AGGR_THREAD,
  58        AGGR_UNSET,
  59        AGGR_NODE,
  60};
  61
  62enum {
  63        CTX_BIT_USER    = 1 << 0,
  64        CTX_BIT_KERNEL  = 1 << 1,
  65        CTX_BIT_HV      = 1 << 2,
  66        CTX_BIT_HOST    = 1 << 3,
  67        CTX_BIT_IDLE    = 1 << 4,
  68        CTX_BIT_MAX     = 1 << 5,
  69};
  70
  71#define NUM_CTX CTX_BIT_MAX
  72
  73enum stat_type {
  74        STAT_NONE = 0,
  75        STAT_NSECS,
  76        STAT_CYCLES,
  77        STAT_STALLED_CYCLES_FRONT,
  78        STAT_STALLED_CYCLES_BACK,
  79        STAT_BRANCHES,
  80        STAT_CACHEREFS,
  81        STAT_L1_DCACHE,
  82        STAT_L1_ICACHE,
  83        STAT_LL_CACHE,
  84        STAT_ITLB_CACHE,
  85        STAT_DTLB_CACHE,
  86        STAT_CYCLES_IN_TX,
  87        STAT_TRANSACTION,
  88        STAT_ELISION,
  89        STAT_TOPDOWN_TOTAL_SLOTS,
  90        STAT_TOPDOWN_SLOTS_ISSUED,
  91        STAT_TOPDOWN_SLOTS_RETIRED,
  92        STAT_TOPDOWN_FETCH_BUBBLES,
  93        STAT_TOPDOWN_RECOVERY_BUBBLES,
  94        STAT_TOPDOWN_RETIRING,
  95        STAT_TOPDOWN_BAD_SPEC,
  96        STAT_TOPDOWN_FE_BOUND,
  97        STAT_TOPDOWN_BE_BOUND,
  98        STAT_TOPDOWN_HEAVY_OPS,
  99        STAT_TOPDOWN_BR_MISPREDICT,
 100        STAT_TOPDOWN_FETCH_LAT,
 101        STAT_TOPDOWN_MEM_BOUND,
 102        STAT_SMI_NUM,
 103        STAT_APERF,
 104        STAT_MAX
 105};
 106
 107struct runtime_stat {
 108        struct rblist value_list;
 109};
 110
 111typedef struct aggr_cpu_id (*aggr_get_id_t)(struct perf_stat_config *config,
 112                             struct perf_cpu_map *m, int cpu);
 113
 114struct perf_stat_config {
 115        enum aggr_mode           aggr_mode;
 116        bool                     scale;
 117        bool                     no_inherit;
 118        bool                     identifier;
 119        bool                     csv_output;
 120        bool                     interval_clear;
 121        bool                     metric_only;
 122        bool                     null_run;
 123        bool                     ru_display;
 124        bool                     big_num;
 125        bool                     no_merge;
 126        bool                     walltime_run_table;
 127        bool                     all_kernel;
 128        bool                     all_user;
 129        bool                     percore_show_thread;
 130        bool                     summary;
 131        bool                     no_csv_summary;
 132        bool                     metric_no_group;
 133        bool                     metric_no_merge;
 134        bool                     stop_read_counter;
 135        bool                     quiet;
 136        bool                     iostat_run;
 137        FILE                    *output;
 138        unsigned int             interval;
 139        unsigned int             timeout;
 140        int                      initial_delay;
 141        unsigned int             unit_width;
 142        unsigned int             metric_only_len;
 143        int                      times;
 144        int                      run_count;
 145        int                      print_free_counters_hint;
 146        int                      print_mixed_hw_group_error;
 147        struct runtime_stat     *stats;
 148        int                      stats_num;
 149        const char              *csv_sep;
 150        struct stats            *walltime_nsecs_stats;
 151        struct rusage            ru_data;
 152        struct cpu_aggr_map     *aggr_map;
 153        aggr_get_id_t            aggr_get_id;
 154        struct cpu_aggr_map     *cpus_aggr_map;
 155        u64                     *walltime_run;
 156        struct rblist            metric_events;
 157        int                      ctl_fd;
 158        int                      ctl_fd_ack;
 159        bool                     ctl_fd_close;
 160        const char              *cgroup_list;
 161        unsigned int            topdown_level;
 162};
 163
 164void perf_stat__set_big_num(int set);
 165void perf_stat__set_no_csv_summary(int set);
 166
 167void update_stats(struct stats *stats, u64 val);
 168double avg_stats(struct stats *stats);
 169double stddev_stats(struct stats *stats);
 170double rel_stddev_stats(double stddev, double avg);
 171
 172static inline void init_stats(struct stats *stats)
 173{
 174        stats->n    = 0.0;
 175        stats->mean = 0.0;
 176        stats->M2   = 0.0;
 177        stats->min  = (u64) -1;
 178        stats->max  = 0;
 179}
 180
 181struct evsel;
 182struct evlist;
 183
 184struct perf_aggr_thread_value {
 185        struct evsel *counter;
 186        struct aggr_cpu_id id;
 187        double uval;
 188        u64 val;
 189        u64 run;
 190        u64 ena;
 191};
 192
 193bool __perf_stat_evsel__is(struct evsel *evsel, enum perf_stat_evsel_id id);
 194
 195#define perf_stat_evsel__is(evsel, id) \
 196        __perf_stat_evsel__is(evsel, PERF_STAT_EVSEL_ID__ ## id)
 197
 198extern struct runtime_stat rt_stat;
 199extern struct stats walltime_nsecs_stats;
 200
 201typedef void (*print_metric_t)(struct perf_stat_config *config,
 202                               void *ctx, const char *color, const char *unit,
 203                               const char *fmt, double val);
 204typedef void (*new_line_t)(struct perf_stat_config *config, void *ctx);
 205
 206void runtime_stat__init(struct runtime_stat *st);
 207void runtime_stat__exit(struct runtime_stat *st);
 208void perf_stat__init_shadow_stats(void);
 209void perf_stat__reset_shadow_stats(void);
 210void perf_stat__reset_shadow_per_stat(struct runtime_stat *st);
 211void perf_stat__update_shadow_stats(struct evsel *counter, u64 count,
 212                                    int cpu, struct runtime_stat *st);
 213struct perf_stat_output_ctx {
 214        void *ctx;
 215        print_metric_t print_metric;
 216        new_line_t new_line;
 217        bool force_header;
 218};
 219
 220void perf_stat__print_shadow_stats(struct perf_stat_config *config,
 221                                   struct evsel *evsel,
 222                                   double avg, int cpu,
 223                                   struct perf_stat_output_ctx *out,
 224                                   struct rblist *metric_events,
 225                                   struct runtime_stat *st);
 226void perf_stat__collect_metric_expr(struct evlist *);
 227
 228int evlist__alloc_stats(struct evlist *evlist, bool alloc_raw);
 229void evlist__free_stats(struct evlist *evlist);
 230void evlist__reset_stats(struct evlist *evlist);
 231void evlist__reset_prev_raw_counts(struct evlist *evlist);
 232void evlist__copy_prev_raw_counts(struct evlist *evlist);
 233void evlist__save_aggr_prev_raw_counts(struct evlist *evlist);
 234
 235int perf_stat_process_counter(struct perf_stat_config *config,
 236                              struct evsel *counter);
 237struct perf_tool;
 238union perf_event;
 239struct perf_session;
 240struct target;
 241
 242int perf_event__process_stat_event(struct perf_session *session,
 243                                   union perf_event *event);
 244
 245size_t perf_event__fprintf_stat(union perf_event *event, FILE *fp);
 246size_t perf_event__fprintf_stat_round(union perf_event *event, FILE *fp);
 247size_t perf_event__fprintf_stat_config(union perf_event *event, FILE *fp);
 248
 249int create_perf_stat_counter(struct evsel *evsel,
 250                             struct perf_stat_config *config,
 251                             struct target *target,
 252                             int cpu);
 253void evlist__print_counters(struct evlist *evlist, struct perf_stat_config *config,
 254                            struct target *_target, struct timespec *ts, int argc, const char **argv);
 255
 256struct metric_expr;
 257double test_generic_metric(struct metric_expr *mexp, int cpu, struct runtime_stat *st);
 258#endif
 259