Linux Perf
sort.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __PERF_SORT_H
3 #define __PERF_SORT_H
4 #include "../builtin.h"
5 
6 #include <regex.h>
7 
8 #include "color.h"
9 #include <linux/list.h>
10 #include "cache.h"
11 #include <linux/rbtree.h>
12 #include "symbol.h"
13 #include "string.h"
14 #include "callchain.h"
15 #include "values.h"
16 
17 #include "../perf.h"
18 #include "debug.h"
19 #include "header.h"
20 
21 #include <subcmd/parse-options.h>
22 #include "parse-events.h"
23 #include "hist.h"
24 #include "srcline.h"
25 
26 struct thread;
27 
28 extern regex_t parent_regex;
29 extern const char *sort_order;
30 extern const char *field_order;
31 extern const char default_parent_pattern[];
32 extern const char *parent_pattern;
33 extern const char *default_sort_order;
34 extern regex_t ignore_callees_regex;
35 extern int have_ignore_callees;
36 extern enum sort_mode sort__mode;
37 extern struct sort_entry sort_comm;
38 extern struct sort_entry sort_dso;
39 extern struct sort_entry sort_sym;
40 extern struct sort_entry sort_parent;
41 extern struct sort_entry sort_dso_from;
42 extern struct sort_entry sort_dso_to;
43 extern struct sort_entry sort_sym_from;
44 extern struct sort_entry sort_sym_to;
45 extern struct sort_entry sort_srcline;
47 extern const char default_mem_sort_order[];
48 
49 struct he_stat {
50  u64 period;
52  u64 period_us;
55  u64 weight;
56  u32 nr_events;
57 };
58 
59 struct namespace_id {
60  u64 dev;
61  u64 ino;
62 };
63 
65  bool computed;
66  union {
67  /* PERF_HPP__DELTA */
69 
70  /* PERF_HPP__RATIO */
71  double period_ratio;
72 
73  /* HISTC_WEIGHTED_DIFF */
74  s64 wdiff;
75  };
76 };
77 
79  void *(*new)(size_t size);
80  void (*free)(void *ptr);
81 };
82 
89 struct hist_entry {
90  struct rb_node rb_node_in;
91  struct rb_node rb_node;
92  union {
93  struct list_head node;
94  struct list_head head;
95  } pairs;
96  struct he_stat stat;
97  struct he_stat *stat_acc;
98  struct map_symbol ms;
99  struct thread *thread;
100  struct comm *comm;
101  struct namespace_id cgroup_id;
102  u64 ip;
104  s32 socket;
105  s32 cpu;
107  u8 depth;
108 
109  /* We are added by hists__add_dummy_entry. */
110  bool dummy;
111  bool leaf;
112 
113  char level;
115  union {
116  /*
117  * Since perf diff only supports the stdio output, TUI
118  * fields are only accessed from perf report (or perf
119  * top). So make it a union to reduce memory usage.
120  */
121  struct hist_entry_diff diff;
122  struct /* for TUI */ {
124  u16 nr_rows;
126  bool unfolded;
129  };
130  };
131  char *srcline;
132  char *srcfile;
133  struct symbol *parent;
135  struct hists *hists;
137  void *raw_data;
138  u32 raw_size;
143  union {
144  /* this is for hierarchical entry structure */
145  struct {
146  struct rb_root hroot_in;
147  struct rb_root hroot_out;
148  }; /* non-leaf entries */
149  struct rb_root sorted_chain; /* leaf entry has callchains */
150  };
151  struct callchain_root callchain[0]; /* must be last member */
152 };
153 
154 static __pure inline bool hist_entry__has_callchains(struct hist_entry *he)
155 {
156  return hists__has_callchains(he->hists);
157 }
158 
159 static inline bool hist_entry__has_pairs(struct hist_entry *he)
160 {
161  return !list_empty(&he->pairs.node);
162 }
163 
164 static inline struct hist_entry *hist_entry__next_pair(struct hist_entry *he)
165 {
166  if (hist_entry__has_pairs(he))
167  return list_entry(he->pairs.node.next, struct hist_entry, pairs.node);
168  return NULL;
169 }
170 
171 static inline void hist_entry__add_pair(struct hist_entry *pair,
172  struct hist_entry *he)
173 {
174  list_add_tail(&pair->pairs.node, &he->pairs.head);
175 }
176 
177 static inline float hist_entry__get_percent_limit(struct hist_entry *he)
178 {
179  u64 period = he->stat.period;
180  u64 total_period = hists__total_period(he->hists);
181 
182  if (unlikely(total_period == 0))
183  return 0;
184 
186  period = he->stat_acc->period;
187 
188  return period * 100.0 / total_period;
189 }
190 
191 static inline u64 cl_address(u64 address)
192 {
193  /* return the cacheline of the address */
194  return (address & ~(cacheline_size() - 1));
195 }
196 
197 static inline u64 cl_offset(u64 address)
198 {
199  /* return the cacheline of the address */
200  return (address & (cacheline_size() - 1));
201 }
202 
203 enum sort_mode {
210 };
211 
212 enum sort_type {
213  /* common sort keys */
230 
231  /* branch stack specific sort keys */
243 
244  /* memory mode specific sort keys */
255 };
256 
257 /*
258  * configurable sorting bits
259  */
260 
261 struct sort_entry {
262  const char *se_header;
263 
264  int64_t (*se_cmp)(struct hist_entry *, struct hist_entry *);
265  int64_t (*se_collapse)(struct hist_entry *, struct hist_entry *);
266  int64_t (*se_sort)(struct hist_entry *, struct hist_entry *);
267  int (*se_snprintf)(struct hist_entry *he, char *bf, size_t size,
268  unsigned int width);
269  int (*se_filter)(struct hist_entry *he, int type, const void *arg);
271 };
272 
273 extern struct sort_entry sort_thread;
274 extern struct list_head hist_entry__sort_list;
275 
276 struct perf_evlist;
277 struct pevent;
278 int setup_sorting(struct perf_evlist *evlist);
279 int setup_output_field(void);
280 void reset_output_field(void);
281 void sort__setup_elide(FILE *fp);
282 void perf_hpp__set_elide(int idx, bool elide);
283 
284 int report_parse_ignore_callees_opt(const struct option *opt, const char *arg, int unset);
285 
286 bool is_strict_order(const char *order);
287 
288 int hpp_dimension__add_output(unsigned col);
289 void reset_dimensions(void);
290 int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
291  struct perf_evlist *evlist,
292  int level);
293 int output_field_add(struct perf_hpp_list *list, char *tok);
294 int64_t
295 sort__iaddr_cmp(struct hist_entry *left, struct hist_entry *right);
296 int64_t
297 sort__daddr_cmp(struct hist_entry *left, struct hist_entry *right);
298 int64_t
299 sort__dcacheline_cmp(struct hist_entry *left, struct hist_entry *right);
300 char *hist_entry__srcline(struct hist_entry *he);
301 #endif /* __PERF_SORT_H */
struct list_head hist_entry__sort_list
int have_ignore_callees
Definition: sort.c:30
s32 cpu
Definition: sort.h:105
Definition: mem2node.c:7
u64 period_us
Definition: sort.h:52
u64 hists__total_period(struct hists *hists)
Definition: hist.c:2454
int hpp_dimension__add_output(unsigned col)
Definition: sort.c:2462
sort_type
Definition: sort.h:212
u32 nr_events
Definition: sort.h:56
bool cumulate_callchain
Definition: symbol.h:93
static bool hist_entry__has_pairs(struct hist_entry *he)
Definition: sort.h:159
size_t size
Definition: evsel.c:60
static u64 cl_offset(u64 address)
Definition: sort.h:197
struct sort_entry sort_sym_to
Definition: sort.c:838
bool has_children
Definition: sort.h:127
struct he_stat stat
Definition: sort.h:96
Definition: sort.h:49
struct sort_entry sort_thread
Definition: sort.c:104
int setup_sorting(struct perf_evlist *evlist)
Definition: sort.c:2959
struct perf_hpp_list * hpp_list
Definition: sort.h:140
double period_ratio_delta
Definition: sort.h:68
bool dummy
Definition: sort.h:110
u16 nr_rows
Definition: sort.h:124
int64_t sort__iaddr_cmp(struct hist_entry *left, struct hist_entry *right)
Definition: sort.c:932
struct sort_entry sort_srcline
Definition: sort.c:359
bool leaf
Definition: sort.h:111
struct hist_entry_ops * ops
Definition: sort.h:142
regex_t ignore_callees_regex
Definition: sort.c:29
bool init_have_children
Definition: sort.h:125
u8 depth
Definition: sort.h:107
const char * se_header
Definition: sort.h:262
char * srcfile
Definition: sort.h:132
int setup_output_field(void)
u64 period_guest_sys
Definition: sort.h:53
void * trace_output
Definition: sort.h:139
struct hist_entry * parent_he
Definition: sort.h:141
Definition: sort.h:78
u64 ip
Definition: sort.h:102
static void hist_entry__add_pair(struct hist_entry *pair, struct hist_entry *he)
Definition: sort.h:171
struct thread * thread
Definition: sort.h:99
Definition: comm.h:11
Definition: sort.h:89
u64 dev
Definition: sort.h:60
struct list_head node
Definition: sort.h:93
u64 period
Definition: sort.h:50
static __pure bool hist_entry__has_callchains(struct hist_entry *he)
Definition: sort.h:154
struct hists * hists
Definition: sort.h:135
Definition: thread.h:18
u64 ino
Definition: sort.h:61
char level
Definition: sort.h:113
enum sort_mode sort__mode
Definition: sort.c:31
bool has_no_entry
Definition: sort.h:128
struct list_head head
Definition: sort.h:94
struct sort_entry sort_sym
Definition: sort.c:323
bool unfolded
Definition: sort.h:126
int64_t sort__dcacheline_cmp(struct hist_entry *left, struct hist_entry *right)
Definition: sort.c:1098
u64 weight
Definition: sort.h:55
struct sort_entry sort_sym_from
Definition: sort.c:830
int64_t sort__daddr_cmp(struct hist_entry *left, struct hist_entry *right)
Definition: sort.c:903
Definition: sort.h:261
int cacheline_size(void)
Definition: util.c:52
int output_field_add(struct perf_hpp_list *list, char *tok)
Definition: sort.c:2845
bool computed
Definition: sort.h:65
char * srcline
Definition: sort.h:131
sort_mode
Definition: sort.h:203
void reset_dimensions(void)
Definition: sort.c:2908
const char * sort_order
Definition: sort.c:27
void reset_output_field(void)
Definition: sort.c:2997
const char default_parent_pattern[]
Definition: sort.c:19
u32 raw_size
Definition: sort.h:138
struct comm * comm
Definition: sort.h:100
struct sort_entry sort_dso_to
Definition: sort.c:822
void * raw_data
Definition: sort.h:137
double period_ratio
Definition: sort.h:71
struct branch_info * branch_info
Definition: sort.h:134
struct mem_info * mem_info
Definition: sort.h:136
void sort__setup_elide(FILE *fp)
Definition: sort.c:2812
s32 socket
Definition: sort.h:104
struct sort_entry sort_dso_from
Definition: sort.c:814
u8 filtered
Definition: sort.h:114
Definition: sort.h:214
static __pure bool hists__has_callchains(struct hists *hists)
Definition: hist.h:223
Definition: sort.h:217
static u64 cl_address(u64 address)
Definition: sort.h:191
int report_parse_ignore_callees_opt(const struct option *opt, const char *arg, int unset)
void free(void *)
struct symbol * parent
Definition: sort.h:133
const char * parent_pattern
Definition: sort.c:20
char * hist_entry__srcline(struct hist_entry *he)
Definition: sort.c:334
s64 wdiff
Definition: sort.h:74
regex_t parent_regex
Definition: sort.c:18
int sort_dimension__add(struct perf_hpp_list *list, const char *tok, struct perf_evlist *evlist, int level)
Definition: sort.c:2468
void perf_hpp__set_elide(int idx, bool elide)
Definition: sort.c:2752
Definition: symbol.h:55
u64 transaction
Definition: sort.h:103
enum sort_type sort__first_dimension
const char default_mem_sort_order[]
Definition: sort.c:23
u16 row_offset
Definition: sort.h:123
bool is_strict_order(const char *order)
Definition: sort.c:2925
u8 se_width_idx
Definition: sort.h:270
Definition: hist.h:71
struct he_stat * stat_acc
Definition: sort.h:97
const char * field_order
Definition: sort.c:28
Definition: sort.h:219
u64 period_guest_us
Definition: sort.h:54
u64 period_sys
Definition: sort.h:51
u8 cpumode
Definition: sort.h:106
static float hist_entry__get_percent_limit(struct hist_entry *he)
Definition: sort.h:177
Definition: sort.h:64
struct sort_entry sort_comm
Definition: sort.c:143
const char * default_sort_order
Definition: sort.c:21
Definition: sort.h:216
struct sort_entry sort_dso
Definition: sort.c:209
union hist_entry::@139 pairs
static struct hist_entry * hist_entry__next_pair(struct hist_entry *he)
Definition: sort.h:164
struct sort_entry sort_parent
Definition: sort.c:498