19 #include <sys/param.h> 59 const unsigned int unresolved_col_width = BITS_PER_LONG / 4;
69 const unsigned int unresolved_col_width = BITS_PER_LONG / 4;
81 symlen += BITS_PER_LONG / 4 + 2 + 3;
84 symlen = unresolved_col_width + 4 + 2;
105 symlen += BITS_PER_LONG / 4 + 2 + 3;
111 symlen = unresolved_col_width + 4 + 2;
119 symlen += BITS_PER_LONG / 4 + 2 + 3;
125 symlen = unresolved_col_width + 4 + 2;
141 + unresolved_col_width + 2;
147 symlen = unresolved_col_width + 4 + 2;
156 + unresolved_col_width + 2;
160 symlen = unresolved_col_width + 4 + 2;
170 symlen = unresolved_col_width + 4 + 2;
175 unresolved_col_width + 4 + 2);
178 symlen = unresolved_col_width + 4 + 2;
212 struct rb_node *next = rb_first(&hists->
entries);
218 while (next && row++ < max_rows) {
227 unsigned int cpumode, u64 period)
230 case PERF_RECORD_MISC_KERNEL:
233 case PERF_RECORD_MISC_USER:
236 case PERF_RECORD_MISC_GUEST_KERNEL:
239 case PERF_RECORD_MISC_GUEST_USER:
251 he_stat->
period += period;
252 he_stat->
weight += weight;
281 if (prev_period == 0)
301 child = rb_entry(node,
struct hist_entry, rb_node);
302 node = rb_next(node);
314 struct rb_root *root_in;
315 struct rb_root *root_out;
329 rb_erase(&he->
rb_node, root_out);
340 struct rb_node *next = rb_first(&hists->
entries);
346 if (((zap_user && n->
level ==
'.') ||
347 (zap_kernel && n->
level !=
'.') ||
356 struct rb_node *next = rb_first(&hists->
entries);
464 size_t callchain_size = 0;
474 he = ops->
new(callchain_size);
583 struct symbol *sym_parent,
595 .dev = ns ? ns->
link_info[CGROUP_NS_INDEX].dev : 0,
596 .ino = ns ? ns->
link_info[CGROUP_NS_INDEX].ino : 0,
613 .parent = sym_parent,
629 struct symbol *sym_parent,
636 sample, sample_self, NULL);
642 struct symbol *sym_parent,
649 sample, sample_self, ops);
827 return iter->
curr >= iter->
total ? 0 : -1;
885 if (he_cache == NULL)
888 iter->
priv = he_cache;
911 he_cache[iter->
curr++] = he;
973 for (i = 0; i < iter->
curr; i++) {
987 he_cache[iter->
curr++] = he;
1037 int max_stack_depth,
void *arg)
1040 struct map *alm = NULL;
1046 iter->
evsel, al, max_stack_depth);
1089 struct hists *hists = left->
hists;
1098 cmp = fmt->
cmp(fmt, left, right);
1109 struct hists *hists = left->
hists;
1118 cmp = fmt->
collapse(fmt, left, right);
1168 const int width = fmt->
width(fmt, hpp, he->
hists);
1169 if (printed < width) {
1171 printed = scnprintf(hpp->
buf, hpp->
size,
"%-*s", width - printed,
" ");
1198 bool type_match =
false;
1240 if (!(he->
filtered & (1 << type))) {
1278 struct rb_root *
root,
1283 struct rb_node **p = &root->rb_node;
1289 while (*p != NULL) {
1295 cmp = fmt->
collapse(fmt, iter, he);
1306 p = &parent->rb_left;
1308 p = &parent->rb_right;
1328 new->trace_output = NULL;
1333 new->srcline = NULL;
1338 new->srcfile = NULL;
1341 rb_link_node(&
new->rb_node_in, parent, p);
1342 rb_insert_color(&
new->rb_node_in, root);
1347 struct rb_root *
root,
1356 list_for_each_entry(node, &hists->
hpp_formats, list) {
1363 if (new_he == NULL) {
1369 new_he->
depth = depth++;
1374 new_he->
leaf =
true;
1394 struct rb_root *
root,
1397 struct rb_node **p = &root->rb_node;
1405 while (*p != NULL) {
1432 p = &(*p)->rb_right;
1443 struct rb_root *
root;
1445 pthread_mutex_lock(&hists->
lock);
1451 pthread_mutex_unlock(&hists->
lock);
1466 struct rb_root *
root;
1478 next = rb_first(root);
1507 struct hists *hists = a->
hists;
1515 cmp = fmt->
sort(fmt, a, b);
1557 node = rb_first(&hists->
entries);
1569 node = rb_next(node);
1580 struct rb_node **p = &root->rb_node;
1585 while (*p != NULL) {
1590 p = &parent->rb_left;
1592 p = &parent->rb_right;
1595 rb_link_node(&he->
rb_node, parent, p);
1596 rb_insert_color(&he->
rb_node, root);
1601 fmt->
sort(fmt, he, NULL);
1607 struct rb_root *root_in,
1608 struct rb_root *root_out,
1609 u64 min_callchain_hits,
1615 *root_out = RB_ROOT;
1616 node = rb_first(root_in);
1620 node = rb_next(node);
1661 u64 min_callchain_hits,
1664 struct rb_node **p = &entries->rb_node;
1669 if (use_callchain) {
1682 while (*p != NULL) {
1689 p = &(*p)->rb_right;
1692 rb_link_node(&he->
rb_node, parent, p);
1693 rb_insert_color(&he->
rb_node, entries);
1698 fmt->
sort(fmt, he, NULL);
1705 struct rb_root *
root;
1708 u64 callchain_total;
1709 u64 min_callchain_hits;
1735 next = rb_first(root);
1810 node = rb_next(node);
1812 while (node == NULL) {
1826 node = rb_prev(node);
1850 node = rb_next(node);
1859 return node && percent >= limit;
1964 for (nd = rb_first(&hists->
entries); nd; nd = rb_next(nd)) {
1976 struct rb_node **p = &root->rb_node;
1979 struct rb_root new_root = RB_ROOT;
1982 while (*p != NULL) {
1989 p = &(*p)->rb_right;
1992 rb_link_node(&he->
rb_node, parent, p);
1993 rb_insert_color(&he->
rb_node, root);
2014 struct rb_root new_root = RB_ROOT;
2021 nd = rb_first(&hists->
entries);
2042 else if (ret == 1) {
2065 nd = rb_first(&hists->
entries);
2139 struct rb_root *
root;
2152 while (*p != NULL) {
2164 p = &(*p)->rb_right;
2183 struct rb_root *
root,
2192 while (*p != NULL) {
2199 cmp = fmt->
collapse(fmt, he, pair);
2207 p = &parent->rb_left;
2209 p = &parent->rb_right;
2254 struct rb_node *n = root->rb_node;
2263 cmp = fmt->
collapse(fmt, iter, he);
2280 struct rb_root *other_root)
2285 for (nd = rb_first(leader_root); nd; nd = rb_next(nd)) {
2301 struct rb_root *
root;
2316 for (nd = rb_first(root); nd; nd = rb_next(nd)) {
2327 struct rb_root *leader_root,
2328 struct rb_root *other_root)
2333 for (nd = rb_first(other_root); nd; nd = rb_next(nd)) {
2340 if (leader->
hists == leader_hists) {
2376 struct rb_root *
root;
2392 for (nd = rb_first(root); nd; nd = rb_next(nd)) {
2429 for (i = bs->
nr - 1; i >= 0; i--) {
2431 nonany_branch_mode ? NULL : prev,
2432 bi[i].
flags.cycles);
2467 unsigned long nr_samples = hists->
stats.
nr_events[PERF_RECORD_SAMPLE];
2471 char buf[512], sample_freq_str[64] =
"";
2472 size_t buflen =
sizeof(buf);
2473 char ref[30] =
" show reference callgraph, ";
2474 bool enable_ref =
false;
2501 strstr(ev_name,
"call-graph=no"))
2505 scnprintf(sample_freq_str,
sizeof(sample_freq_str),
" %d Hz,", evsel->
attr.sample_freq);
2508 printed = scnprintf(bf, size,
2509 "Samples: %lu%c of event%s '%s',%s%sEvent count (approx.): %" PRIu64,
2510 nr_samples, unit, evsel->
nr_members > 1 ?
"s" :
"",
2511 ev_name, sample_freq_str, enable_ref ? ref :
" ", nr_events);
2515 printed += snprintf(bf + printed, size - printed,
2519 printed += scnprintf(bf + printed, size - printed,
2524 printed += scnprintf(bf + printed, size - printed,
2530 printed += scnprintf(bf + printed, size - printed,
2533 printed += scnprintf(bf + printed, size - printed,
2534 ", Processor Socket: %d", socket_id);
2540 const char *arg,
int unset __maybe_unused)
2542 if (!strcmp(arg,
"relative"))
2544 else if (!strcmp(arg,
"absolute"))
2547 pr_debug(
"Invalid percentage: %s\n", arg);
2556 if (!strcmp(var,
"hist.percentage"))
2564 memset(hists, 0,
sizeof(*hists));
2569 pthread_mutex_init(&hists->
lock, NULL);
2581 while (!RB_EMPTY_ROOT(root)) {
2582 node = rb_first(root);
2583 rb_erase(node, root);
2606 list_for_each_entry_safe(node, tmp, &hists->
hpp_formats, list) {
2608 list_del(&fmt->
list);
2611 list_del(&node->
list);
2635 fputs(
"FATAL ERROR: Couldn't setup hists class\n", stderr);
2642 INIT_LIST_HEAD(&list->
fields);
2643 INIT_LIST_HEAD(&list->
sorts);
int64_t hist_entry__collapse(struct hist_entry *left, struct hist_entry *right)
struct rb_root * entries_in
int(* add_entry_cb)(struct hist_entry_iter *iter, struct addr_location *al, bool single, void *arg)
void hists__inc_nr_events(struct hists *hists, u32 type)
void ui_progress__update(struct ui_progress *p, u64 adv)
static struct hist_entry * add_dummy_hierarchy_entry(struct hists *hists, struct rb_root *root, struct hist_entry *pair)
const char * col_width_list_str
void hists__filter_by_symbol(struct hists *hists)
struct perf_sample * sample
static int iter_add_single_normal_entry(struct hist_entry_iter *iter, struct addr_location *al)
int(* width)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, struct hists *hists)
struct hist_entry_diff diff
bool perf_hpp__is_dynamic_entry(struct perf_hpp_fmt *format)
void decay_callchain(struct callchain_root *root)
static int iter_add_next_branch_entry(struct hist_entry_iter *iter, struct addr_location *al)
static void hierarchy_recalc_total_periods(struct hists *hists)
static void he_stat__add_stat(struct he_stat *dest, struct he_stat *src)
static struct hist_entry * hierarchy_insert_entry(struct hists *hists, struct rb_root *root, struct hist_entry *he, struct hist_entry *parent_he, struct perf_hpp_list *hpp_list)
static void output_resort(struct hists *hists, struct ui_progress *prog, bool use_callchain, hists__resort_cb_t cb)
struct strlist * comm_list
u64 hists__total_period(struct hists *hists)
static void hist_entry__check_and_remove_filter(struct hist_entry *he, enum hist_filter type, fmt_chk_fn check)
static void callchain_cursor_snapshot(struct callchain_cursor *dest, struct callchain_cursor *src)
struct perf_ns_link_info link_info[]
static int iter_next_cumulative_entry(struct hist_entry_iter *iter, struct addr_location *al)
static bool hist_entry__has_pairs(struct hist_entry *he)
static bool hists__filter_entry_by_dso(struct hists *hists, struct hist_entry *he)
static bool perf_hpp__should_skip(struct perf_hpp_fmt *format, struct hists *hists)
struct intlist * pid_list
static void callchain_cursor_reset(struct callchain_cursor *cursor)
u64 callchain_non_filtered_period
static void hists__filter_hierarchy(struct hists *hists, int type, const void *arg)
#define thread__zput(thread)
int hists__link(struct hists *leader, struct hists *other)
static int iter_next_branch_entry(struct hist_entry_iter *iter, struct addr_location *al)
int64_t hist_entry__cmp(struct hist_entry *left, struct hist_entry *right)
struct rb_node * rb_hierarchy_prev(struct rb_node *node)
int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node *node, bool hide_unresolved)
int hist_entry__snprintf_alignment(struct hist_entry *he, struct perf_hpp *hpp, struct perf_hpp_fmt *fmt, int printed)
int perf_hist_config(const char *var, const char *value)
void hists__output_recalc_col_len(struct hists *hists, int max_rows)
struct hist_entry * hists__add_entry(struct hists *hists, struct addr_location *al, struct symbol *sym_parent, struct branch_info *bi, struct mem_info *mi, struct perf_sample *sample, bool sample_self)
int hist_entry__transaction_len(void)
int hists__collapse_resort(struct hists *hists, struct ui_progress *prog)
struct perf_hpp_list * hpp_list
void hists__calc_col_len(struct hists *hists, struct hist_entry *h)
void hists__output_resort_cb(struct hists *hists, struct ui_progress *prog, hists__resort_cb_t cb)
static void hists_evsel__exit(struct perf_evsel *evsel)
u64 nr_non_filtered_entries
static void hists__delete_entry(struct hists *hists, struct hist_entry *he)
static void hierarchy_insert_output_entry(struct rb_root *root, struct hist_entry *he)
struct hist_entry_ops * ops
struct addr_map_symbol daddr
static int iter_next_nop_entry(struct hist_entry_iter *iter __maybe_unused, struct addr_location *al __maybe_unused)
const char * uid_filter_str
static void callchain_cursor_commit(struct callchain_cursor *cursor)
static struct hists * evsel__hists(struct perf_evsel *evsel)
struct branch_flags flags
void *(* new)(size_t size)
static int iter_finish_mem_entry(struct hist_entry_iter *iter, struct addr_location *al __maybe_unused)
static u8 symbol__parent_filter(const struct symbol *parent)
static void he_stat__add_cpumode_period(struct he_stat *he_stat, unsigned int cpumode, u64 period)
void hists__reset_stats(struct hists *hists)
int64_t(* sort)(struct perf_hpp_fmt *fmt, struct hist_entry *a, struct hist_entry *b)
struct hist_entry * parent_he
#define perf_hpp_list__for_each_format(_list, format)
x86 movsq based memset() in arch/x86/lib/memset_64.S") MEMSET_FN(memset_erms
struct callchain_root callchain[0]
static bool check_thread_entry(struct perf_hpp_fmt *fmt)
void map__put(struct map *map)
struct list_head hpp_formats
static void hist_entry__add_pair(struct hist_entry *pair, struct hist_entry *he)
static int hists__collapse_insert_entry(struct hists *hists, struct rb_root *root, struct hist_entry *he)
struct branch_entry entries[0]
static int iter_add_next_cumulative_entry(struct hist_entry_iter *iter, struct addr_location *al)
int sample__resolve_callchain(struct perf_sample *sample, struct callchain_cursor *cursor, struct symbol **parent, struct perf_evsel *evsel, struct addr_location *al, int max_stack)
static void resort_filtered_entry(struct rb_root *root, struct hist_entry *he)
struct rb_node * rb_hierarchy_last(struct rb_node *node)
int hist_entry__filter(struct hist_entry *he, int type, const void *arg)
static __pure bool hist_entry__has_callchains(struct hist_entry *he)
int64_t(* cmp)(struct perf_hpp_fmt *fmt, struct hist_entry *a, struct hist_entry *b)
static int iter_add_single_mem_entry(struct hist_entry_iter *iter, struct addr_location *al)
int dso__name_len(const struct dso *dso)
struct namespaces * thread__namespaces(const struct thread *thread)
static int hist_entry__sort(struct hist_entry *a, struct hist_entry *b)
int(* finish_entry)(struct hist_entry_iter *, struct addr_location *)
int perf_evsel__group_desc(struct perf_evsel *evsel, char *buf, size_t size)
int thread__comm_len(struct thread *thread)
static int iter_add_single_branch_entry(struct hist_entry_iter *iter __maybe_unused, struct addr_location *al __maybe_unused)
const char * thread__comm_str(const struct thread *thread)
bool(* filter_fn_t)(struct hists *hists, struct hist_entry *he)
static struct perf_evsel * hists_to_evsel(struct hists *hists)
static void hists__inc_filter_stats(struct hists *hists, struct hist_entry *h)
#define pr_debug(fmt,...)
void hists__output_resort(struct hists *hists, struct ui_progress *prog)
bool perf_hpp__is_srcline_entry(struct perf_hpp_fmt *fmt)
int(* add_single_entry)(struct hist_entry_iter *, struct addr_location *)
#define evlist__for_each_entry(evlist, evsel)
static void callchain_cursor_advance(struct callchain_cursor *cursor)
int addr_map_symbol__account_cycles(struct addr_map_symbol *ams, struct addr_map_symbol *start, unsigned cycles)
static void hists__match_hierarchy(struct rb_root *leader_root, struct rb_root *other_root)
static int entry(u64 ip, struct unwind_info *ui)
bool hists__new_col_len(struct hists *hists, enum hist_column col, u16 len)
u32 nr_non_filtered_samples
static void hists__delete_remaining_entries(struct rb_root *root)
static void hists__apply_filters(struct hists *hists, struct hist_entry *he)
struct rb_root entries_in_array[2]
int(* hists__resort_cb_t)(struct hist_entry *he)
static bool can_goto_child(struct hist_entry *he, enum hierarchy_move_dir hmd)
u16 hists__col_len(struct hists *hists, enum hist_column col)
void free_srcline(char *srcline)
int64_t(* collapse)(struct perf_hpp_fmt *fmt, struct hist_entry *a, struct hist_entry *b)
bool perf_hpp__is_sym_entry(struct perf_hpp_fmt *fmt)
void free_callchain(struct callchain_root *root)
unsigned long convert_unit(unsigned long value, char *unit)
bool perf_hpp__is_thread_entry(struct perf_hpp_fmt *fmt)
static int iter_finish_cumulative_entry(struct hist_entry_iter *iter, struct addr_location *al __maybe_unused)
int callchain_merge(struct callchain_cursor *cursor, struct callchain_root *dst, struct callchain_root *src)
struct rb_root sorted_chain
static void hists__reset_filter_stats(struct hists *hists)
#define hists__has(__h, __f)
#define hists__for_each_sort_list(hists, format)
bool hist_entry__has_hierarchy_children(struct hist_entry *he, float limit)
void events_stats__inc(struct events_stats *stats, u32 type)
static void __hists__insert_output_entry(struct rb_root *entries, struct hist_entry *he, u64 min_callchain_hits, bool use_callchain)
int callchain_append(struct callchain_root *root, struct callchain_cursor *cursor, u64 period)
const struct dso * dso_filter
const char * symbol_filter_str
static void hists__remove_entry_filter(struct hists *hists, struct hist_entry *he, enum hist_filter type)
struct branch_stack * branch_stack
static void callchain_init(struct callchain_root *root)
bool perf_hpp__is_comm_entry(struct perf_hpp_fmt *fmt)
static struct hist_entry * hists__findnew_entry(struct hists *hists, struct hist_entry *entry, struct addr_location *al, bool sample_self)
static struct hist_entry * __hists__add_entry(struct hists *hists, struct addr_location *al, struct symbol *sym_parent, struct branch_info *bi, struct mem_info *mi, struct perf_sample *sample, bool sample_self, struct hist_entry_ops *ops)
void hist_entry__delete(struct hist_entry *he)
static int iter_prepare_normal_entry(struct hist_entry_iter *iter __maybe_unused, struct addr_location *al __maybe_unused)
static void hist_entry__add_callchain_period(struct hist_entry *he, u64 period)
static int hists__link_hierarchy(struct hists *leader_hists, struct hist_entry *parent, struct rb_root *leader_root, struct rb_root *other_root)
x86 movsq based memcpy() in arch/x86/lib/memcpy_64.S") MEMCPY_FN(memcpy_erms
static void hists__delete_all_entries(struct hists *hists)
struct strlist * sym_list
bool perf_hpp__is_trace_entry(struct perf_hpp_fmt *fmt)
void hists__reset_col_len(struct hists *hists)
static void he_stat__add_period(struct he_stat *he_stat, u64 period, u64 weight)
struct rb_node rb_node_in
static bool hists__filter_entry_by_thread(struct hists *hists, struct hist_entry *he)
static int iter_prepare_branch_entry(struct hist_entry_iter *iter, struct addr_location *al)
const char * perf_evsel__name(struct perf_evsel *evsel)
struct thread * thread_filter
static int iter_finish_branch_entry(struct hist_entry_iter *iter, struct addr_location *al __maybe_unused)
static struct map * map__get(struct map *map)
const struct hist_iter_ops hist_iter_mem
size_t events_stats__fprintf(struct events_stats *stats, FILE *fp)
int __hists__init(struct hists *hists, struct perf_hpp_list *hpp_list)
const struct hist_iter_ops hist_iter_normal
struct strfilter * filter
bool(* fmt_chk_fn)(struct perf_hpp_fmt *fmt)
struct branch_info * branch_info
bool perf_hpp__defined_dynamic_entry(struct perf_hpp_fmt *fmt, struct hists *hists)
void hist__account_cycles(struct branch_stack *bs, struct addr_location *al, struct perf_sample *sample, bool nonany_branch_mode)
struct mem_info * mem_info
#define for_each_group_member(_evsel, _leader)
#define mem_info__zput(mi)
struct rb_root * hists__get_rotate_entries_in(struct hists *hists)
void hists__filter_by_socket(struct hists *hists)
struct sort_entry sort_srcline
static void he_stat__decay(struct he_stat *he_stat)
struct rb_node * __rb_hierarchy_next(struct rb_node *node, enum hierarchy_move_dir hmd)
void hists__match(struct hists *leader, struct hists *other)
u16 col_len[HISTC_NR_COLS]
static int iter_finish_normal_entry(struct hist_entry_iter *iter, struct addr_location *al __maybe_unused)
static struct hist_entry * hists__add_dummy_entry(struct hists *hists, struct hist_entry *pair)
static int iter_prepare_mem_entry(struct hist_entry_iter *iter, struct addr_location *al)
static void hist_entry__apply_hierarchy_filters(struct hist_entry *he)
void hists__filter_by_thread(struct hists *hists)
static bool hists__filter_entry_by_socket(struct hists *hists, struct hist_entry *he)
bool show_branchflag_count
static void advance_hpp(struct perf_hpp *hpp, int inc)
static struct hist_entry * hists__find_entry(struct hists *hists, struct hist_entry *he)
struct perf_evsel * evsel
int hist_entry__append_callchain(struct hist_entry *he, struct perf_sample *sample)
void hists__inc_stats(struct hists *hists, struct hist_entry *h)
size_t perf_evlist__fprintf_nr_events(struct perf_evlist *evlist, FILE *fp)
static double percent(int st, int tot)
int(* next_entry)(struct hist_entry_iter *, struct addr_location *)
void perf_hpp_list__init(struct perf_hpp_list *list)
struct perf_hpp_list * hpp_list
static struct hist_entry * hists__find_hierarchy_entry(struct rb_root *root, struct hist_entry *he)
const struct hist_iter_ops hist_iter_cumulative
void hists__decay_entries(struct hists *hists, bool zap_user, bool zap_kernel)
struct hist_entry * hists__add_entry_ops(struct hists *hists, struct hist_entry_ops *ops, struct addr_location *al, struct symbol *sym_parent, struct branch_info *bi, struct mem_info *mi, struct perf_sample *sample, bool sample_self)
struct addr_map_symbol to
static void hists__filter_by_type(struct hists *hists, int type, filter_fn_t filter)
struct addr_map_symbol from
struct events_stats stats
const struct hist_iter_ops hist_iter_branch
static int iter_add_single_cumulative_entry(struct hist_entry_iter *iter, struct addr_location *al)
u32 nr_events[PERF_RECORD_HEADER_MAX]
void hists__filter_by_dso(struct hists *hists)
static bool perf_evsel__is_group_event(struct perf_evsel *evsel)
int(* prepare_entry)(struct hist_entry_iter *, struct addr_location *)
struct addr_map_symbol iaddr
static int check(union perf_mem_data_src data_src, const char *string)
struct mem_info * sample__resolve_mem(struct perf_sample *sample, struct addr_location *al)
void hists__delete_entries(struct hists *hists)
void perf_evsel__output_resort(struct perf_evsel *evsel, struct ui_progress *prog)
static void * hist_entry__zalloc(size_t size)
struct branch_info * sample__resolve_bstack(struct perf_sample *sample, struct addr_location *al)
static bool hists__decay_entry(struct hists *hists, struct hist_entry *he)
bool perf_hpp__is_srcfile_entry(struct perf_hpp_fmt *fmt)
const struct hist_iter_ops * ops
struct comm * thread__comm(const struct thread *thread)
int parse_filter_percentage(const struct option *opt __maybe_unused, const char *arg, int unset __maybe_unused)
struct thread * thread__get(struct thread *thread)
struct intlist * tid_list
u64 total_non_filtered_period
int(* add_next_entry)(struct hist_entry_iter *, struct addr_location *)
static int hist_entry__init(struct hist_entry *he, struct hist_entry *template, bool sample_self)
struct he_stat * stat_acc
static void hists__set_unres_dso_col_len(struct hists *hists, int dso)
struct rb_root entries_collapsed
static bool evsel__has_callchain(const struct perf_evsel *evsel)
void hists__inc_nr_samples(struct hists *hists, bool filtered)
void hists__set_col_len(struct hists *hists, enum hist_column col, u16 len)
static void hist_entry__free(void *ptr)
#define perf_hpp_list__for_each_format_safe(_list, format, tmp)
static int iter_prepare_cumulative_entry(struct hist_entry_iter *iter, struct addr_location *al __maybe_unused)
bool perf_hpp__is_dso_entry(struct perf_hpp_fmt *fmt)
static float hist_entry__get_percent_limit(struct hist_entry *he)
static void hists__hierarchy_output_resort(struct hists *hists, struct ui_progress *prog, struct rb_root *root_in, struct rb_root *root_out, u64 min_callchain_hits, bool use_callchain)
struct strlist * dso_list
struct perf_event_attr attr
static int hists_evsel__init(struct perf_evsel *evsel)
struct branch_flags flags
int hist_entry_iter__add(struct hist_entry_iter *iter, struct addr_location *al, int max_stack_depth, void *arg)
static struct hist_entry * hist_entry__new(struct hist_entry *template, bool sample_self)
static int iter_add_next_nop_entry(struct hist_entry_iter *iter __maybe_unused, struct addr_location *al __maybe_unused)
static struct callchain_cursor_node * callchain_cursor_current(struct callchain_cursor *cursor)
union hist_entry::@139 pairs
#define perf_hpp_list__for_each_sort_list(_list, format)
int __hists__scnprintf_title(struct hists *hists, char *bf, size_t size, bool show_freq)
void static void * zalloc(size_t size)
static int hists__hierarchy_insert_entry(struct hists *hists, struct rb_root *root, struct hist_entry *he)
int perf_evsel__object_config(size_t object_size, int(*init)(struct perf_evsel *evsel), void(*fini)(struct perf_evsel *evsel))
static bool hists__filter_entry_by_symbol(struct hists *hists, struct hist_entry *he)
static struct hist_entry_ops default_ops