linux/tools/perf/util/hist.h
<<
>>
Prefs
   1#ifndef __PERF_HIST_H
   2#define __PERF_HIST_H
   3
   4#include <linux/types.h>
   5#include <pthread.h>
   6#include "callchain.h"
   7#include "header.h"
   8
   9extern struct callchain_param callchain_param;
  10
  11struct hist_entry;
  12struct addr_location;
  13struct symbol;
  14
  15/*
  16 * The kernel collects the number of events it couldn't send in a stretch and
  17 * when possible sends this number in a PERF_RECORD_LOST event. The number of
  18 * such "chunks" of lost events is stored in .nr_events[PERF_EVENT_LOST] while
  19 * total_lost tells exactly how many events the kernel in fact lost, i.e. it is
  20 * the sum of all struct lost_event.lost fields reported.
  21 *
  22 * The total_period is needed because by default auto-freq is used, so
  23 * multipling nr_events[PERF_EVENT_SAMPLE] by a frequency isn't possible to get
  24 * the total number of low level events, it is necessary to to sum all struct
  25 * sample_event.period and stash the result in total_period.
  26 */
  27struct events_stats {
  28        u64 total_period;
  29        u64 total_lost;
  30        u64 total_invalid_chains;
  31        u32 nr_events[PERF_RECORD_HEADER_MAX];
  32        u32 nr_lost_warned;
  33        u32 nr_unknown_events;
  34        u32 nr_invalid_chains;
  35        u32 nr_unknown_id;
  36        u32 nr_unprocessable_samples;
  37};
  38
  39enum hist_column {
  40        HISTC_SYMBOL,
  41        HISTC_DSO,
  42        HISTC_THREAD,
  43        HISTC_COMM,
  44        HISTC_PARENT,
  45        HISTC_CPU,
  46        HISTC_SRCLINE,
  47        HISTC_MISPREDICT,
  48        HISTC_SYMBOL_FROM,
  49        HISTC_SYMBOL_TO,
  50        HISTC_DSO_FROM,
  51        HISTC_DSO_TO,
  52        HISTC_LOCAL_WEIGHT,
  53        HISTC_GLOBAL_WEIGHT,
  54        HISTC_MEM_DADDR_SYMBOL,
  55        HISTC_MEM_DADDR_DSO,
  56        HISTC_MEM_LOCKED,
  57        HISTC_MEM_TLB,
  58        HISTC_MEM_LVL,
  59        HISTC_MEM_SNOOP,
  60        HISTC_NR_COLS, /* Last entry */
  61};
  62
  63struct thread;
  64struct dso;
  65
  66struct hists {
  67        struct rb_root          entries_in_array[2];
  68        struct rb_root          *entries_in;
  69        struct rb_root          entries;
  70        struct rb_root          entries_collapsed;
  71        u64                     nr_entries;
  72        const struct thread     *thread_filter;
  73        const struct dso        *dso_filter;
  74        const char              *uid_filter_str;
  75        const char              *symbol_filter_str;
  76        pthread_mutex_t         lock;
  77        struct events_stats     stats;
  78        u64                     event_stream;
  79        u16                     col_len[HISTC_NR_COLS];
  80};
  81
  82struct hist_entry *__hists__add_entry(struct hists *self,
  83                                      struct addr_location *al,
  84                                      struct symbol *parent, u64 period,
  85                                      u64 weight);
  86int64_t hist_entry__cmp(struct hist_entry *left, struct hist_entry *right);
  87int64_t hist_entry__collapse(struct hist_entry *left, struct hist_entry *right);
  88int hist_entry__sort_snprintf(struct hist_entry *self, char *bf, size_t size,
  89                              struct hists *hists);
  90void hist_entry__free(struct hist_entry *);
  91
  92struct hist_entry *__hists__add_branch_entry(struct hists *self,
  93                                             struct addr_location *al,
  94                                             struct symbol *sym_parent,
  95                                             struct branch_info *bi,
  96                                             u64 period,
  97                                             u64 weight);
  98
  99struct hist_entry *__hists__add_mem_entry(struct hists *self,
 100                                          struct addr_location *al,
 101                                          struct symbol *sym_parent,
 102                                          struct mem_info *mi,
 103                                          u64 period,
 104                                          u64 weight);
 105
 106void hists__output_resort(struct hists *self);
 107void hists__collapse_resort(struct hists *self);
 108
 109void hists__decay_entries(struct hists *hists, bool zap_user, bool zap_kernel);
 110void hists__output_recalc_col_len(struct hists *hists, int max_rows);
 111
 112void hists__inc_nr_entries(struct hists *hists, struct hist_entry *h);
 113void hists__inc_nr_events(struct hists *self, u32 type);
 114void events_stats__inc(struct events_stats *stats, u32 type);
 115size_t events_stats__fprintf(struct events_stats *stats, FILE *fp);
 116
 117size_t hists__fprintf(struct hists *self, bool show_header, int max_rows,
 118                      int max_cols, float min_pcnt, FILE *fp);
 119
 120int hist_entry__inc_addr_samples(struct hist_entry *self, int evidx, u64 addr);
 121int hist_entry__annotate(struct hist_entry *self, size_t privsize);
 122
 123void hists__filter_by_dso(struct hists *hists);
 124void hists__filter_by_thread(struct hists *hists);
 125void hists__filter_by_symbol(struct hists *hists);
 126
 127u16 hists__col_len(struct hists *self, enum hist_column col);
 128void hists__set_col_len(struct hists *self, enum hist_column col, u16 len);
 129bool hists__new_col_len(struct hists *self, enum hist_column col, u16 len);
 130void hists__reset_col_len(struct hists *hists);
 131void hists__calc_col_len(struct hists *hists, struct hist_entry *he);
 132
 133void hists__match(struct hists *leader, struct hists *other);
 134int hists__link(struct hists *leader, struct hists *other);
 135
 136struct perf_hpp {
 137        char *buf;
 138        size_t size;
 139        const char *sep;
 140        void *ptr;
 141};
 142
 143struct perf_hpp_fmt {
 144        int (*header)(struct perf_hpp *hpp);
 145        int (*width)(struct perf_hpp *hpp);
 146        int (*color)(struct perf_hpp *hpp, struct hist_entry *he);
 147        int (*entry)(struct perf_hpp *hpp, struct hist_entry *he);
 148
 149        struct list_head list;
 150};
 151
 152extern struct list_head perf_hpp__list;
 153
 154#define perf_hpp__for_each_format(format) \
 155        list_for_each_entry(format, &perf_hpp__list, list)
 156
 157extern struct perf_hpp_fmt perf_hpp__format[];
 158
 159enum {
 160        PERF_HPP__BASELINE,
 161        PERF_HPP__OVERHEAD,
 162        PERF_HPP__OVERHEAD_SYS,
 163        PERF_HPP__OVERHEAD_US,
 164        PERF_HPP__OVERHEAD_GUEST_SYS,
 165        PERF_HPP__OVERHEAD_GUEST_US,
 166        PERF_HPP__SAMPLES,
 167        PERF_HPP__PERIOD,
 168        PERF_HPP__PERIOD_BASELINE,
 169        PERF_HPP__DELTA,
 170        PERF_HPP__RATIO,
 171        PERF_HPP__WEIGHTED_DIFF,
 172        PERF_HPP__FORMULA,
 173
 174        PERF_HPP__MAX_INDEX
 175};
 176
 177void perf_hpp__init(void);
 178void perf_hpp__column_register(struct perf_hpp_fmt *format);
 179void perf_hpp__column_enable(unsigned col);
 180int hist_entry__period_snprintf(struct perf_hpp *hpp, struct hist_entry *he,
 181                                bool color);
 182
 183struct perf_evlist;
 184
 185struct hist_browser_timer {
 186        void (*timer)(void *arg);
 187        void *arg;
 188        int refresh;
 189};
 190
 191#ifdef SLANG_SUPPORT
 192#include "../ui/keysyms.h"
 193int hist_entry__tui_annotate(struct hist_entry *he, struct perf_evsel *evsel,
 194                             struct hist_browser_timer *hbt);
 195
 196int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help,
 197                                  struct hist_browser_timer *hbt,
 198                                  float min_pcnt,
 199                                  struct perf_session_env *env);
 200int script_browse(const char *script_opt);
 201#else
 202static inline
 203int perf_evlist__tui_browse_hists(struct perf_evlist *evlist __maybe_unused,
 204                                  const char *help __maybe_unused,
 205                                  struct hist_browser_timer *hbt __maybe_unused,
 206                                  float min_pcnt __maybe_unused,
 207                                  struct perf_session_env *env __maybe_unused)
 208{
 209        return 0;
 210}
 211
 212static inline int hist_entry__tui_annotate(struct hist_entry *self
 213                                           __maybe_unused,
 214                                           struct perf_evsel *evsel
 215                                           __maybe_unused,
 216                                           struct hist_browser_timer *hbt
 217                                           __maybe_unused)
 218{
 219        return 0;
 220}
 221
 222static inline int script_browse(const char *script_opt __maybe_unused)
 223{
 224        return 0;
 225}
 226
 227#define K_LEFT  -1000
 228#define K_RIGHT -2000
 229#define K_SWITCH_INPUT_DATA -3000
 230#endif
 231
 232#ifdef GTK2_SUPPORT
 233int perf_evlist__gtk_browse_hists(struct perf_evlist *evlist, const char *help,
 234                                  struct hist_browser_timer *hbt __maybe_unused,
 235                                  float min_pcnt);
 236#else
 237static inline
 238int perf_evlist__gtk_browse_hists(struct perf_evlist *evlist __maybe_unused,
 239                                  const char *help __maybe_unused,
 240                                  struct hist_browser_timer *hbt __maybe_unused,
 241                                  float min_pcnt __maybe_unused)
 242{
 243        return 0;
 244}
 245#endif
 246
 247unsigned int hists__sort_list_width(struct hists *self);
 248
 249double perf_diff__compute_delta(struct hist_entry *he, struct hist_entry *pair);
 250double perf_diff__compute_ratio(struct hist_entry *he, struct hist_entry *pair);
 251s64 perf_diff__compute_wdiff(struct hist_entry *he, struct hist_entry *pair);
 252int perf_diff__formula(struct hist_entry *he, struct hist_entry *pair,
 253                       char *buf, size_t size);
 254double perf_diff__period_percent(struct hist_entry *he, u64 period);
 255#endif  /* __PERF_HIST_H */
 256