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