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 "callchain.h"
   6
   7extern struct callchain_param callchain_param;
   8
   9struct hist_entry;
  10struct addr_location;
  11struct symbol;
  12struct rb_root;
  13
  14struct objdump_line {
  15        struct list_head node;
  16        s64              offset;
  17        char             *line;
  18};
  19
  20void objdump_line__free(struct objdump_line *self);
  21struct objdump_line *objdump__get_next_ip_line(struct list_head *head,
  22                                               struct objdump_line *pos);
  23
  24struct sym_hist {
  25        u64             sum;
  26        u64             ip[0];
  27};
  28
  29struct sym_ext {
  30        struct rb_node  node;
  31        double          percent;
  32        char            *path;
  33};
  34
  35struct sym_priv {
  36        struct sym_hist *hist;
  37        struct sym_ext  *ext;
  38};
  39
  40/*
  41 * The kernel collects the number of events it couldn't send in a stretch and
  42 * when possible sends this number in a PERF_RECORD_LOST event. The number of
  43 * such "chunks" of lost events is stored in .nr_events[PERF_EVENT_LOST] while
  44 * total_lost tells exactly how many events the kernel in fact lost, i.e. it is
  45 * the sum of all struct lost_event.lost fields reported.
  46 *
  47 * The total_period is needed because by default auto-freq is used, so
  48 * multipling nr_events[PERF_EVENT_SAMPLE] by a frequency isn't possible to get
  49 * the total number of low level events, it is necessary to to sum all struct
  50 * sample_event.period and stash the result in total_period.
  51 */
  52struct events_stats {
  53        u64 total_period;
  54        u64 total_lost;
  55        u64 total_invalid_chains;
  56        u32 nr_events[PERF_RECORD_HEADER_MAX];
  57        u32 nr_unknown_events;
  58        u32 nr_invalid_chains;
  59};
  60
  61enum hist_column {
  62        HISTC_SYMBOL,
  63        HISTC_DSO,
  64        HISTC_THREAD,
  65        HISTC_COMM,
  66        HISTC_PARENT,
  67        HISTC_CPU,
  68        HISTC_NR_COLS, /* Last entry */
  69};
  70
  71struct hists {
  72        struct rb_node          rb_node;
  73        struct rb_root          entries;
  74        u64                     nr_entries;
  75        struct events_stats     stats;
  76        u64                     config;
  77        u64                     event_stream;
  78        u32                     type;
  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);
  85extern int64_t hist_entry__cmp(struct hist_entry *, struct hist_entry *);
  86extern int64_t hist_entry__collapse(struct hist_entry *, struct hist_entry *);
  87int hist_entry__fprintf(struct hist_entry *self, struct hists *hists,
  88                        struct hists *pair_hists, bool show_displacement,
  89                        long displacement, FILE *fp, u64 total);
  90int hist_entry__snprintf(struct hist_entry *self, char *bf, size_t size,
  91                         struct hists *hists, struct hists *pair_hists,
  92                         bool show_displacement, long displacement,
  93                         bool color, u64 total);
  94void hist_entry__free(struct hist_entry *);
  95
  96void hists__output_resort(struct hists *self);
  97void hists__collapse_resort(struct hists *self);
  98
  99void hists__inc_nr_events(struct hists *self, u32 type);
 100size_t hists__fprintf_nr_events(struct hists *self, FILE *fp);
 101
 102size_t hists__fprintf(struct hists *self, struct hists *pair,
 103                      bool show_displacement, FILE *fp);
 104
 105int hist_entry__inc_addr_samples(struct hist_entry *self, u64 ip);
 106int hist_entry__annotate(struct hist_entry *self, struct list_head *head,
 107                         size_t privsize);
 108
 109void hists__filter_by_dso(struct hists *self, const struct dso *dso);
 110void hists__filter_by_thread(struct hists *self, const struct thread *thread);
 111
 112u16 hists__col_len(struct hists *self, enum hist_column col);
 113void hists__set_col_len(struct hists *self, enum hist_column col, u16 len);
 114bool hists__new_col_len(struct hists *self, enum hist_column col, u16 len);
 115
 116#ifdef NO_NEWT_SUPPORT
 117static inline int hists__browse(struct hists *self __used,
 118                                const char *helpline __used,
 119                                const char *ev_name __used)
 120{
 121        return 0;
 122}
 123
 124static inline int hists__tui_browse_tree(struct rb_root *self __used,
 125                                         const char *help __used)
 126{
 127        return 0;
 128}
 129
 130static inline int hist_entry__tui_annotate(struct hist_entry *self __used)
 131{
 132        return 0;
 133}
 134#define KEY_LEFT -1
 135#define KEY_RIGHT -2
 136#else
 137#include <newt.h>
 138int hists__browse(struct hists *self, const char *helpline,
 139                  const char *ev_name);
 140int hist_entry__tui_annotate(struct hist_entry *self);
 141
 142#define KEY_LEFT NEWT_KEY_LEFT
 143#define KEY_RIGHT NEWT_KEY_RIGHT
 144
 145int hists__tui_browse_tree(struct rb_root *self, const char *help);
 146#endif
 147
 148unsigned int hists__sort_list_width(struct hists *self);
 149
 150#endif  /* __PERF_HIST_H */
 151