Lines Matching refs:he

34 				       struct hist_entry *he);
36 struct hist_entry *he);
38 struct hist_entry *he);
40 struct hist_entry *he);
311 static void hists__delete_entry(struct hists *hists, struct hist_entry *he);
313 static bool hists__decay_entry(struct hists *hists, struct hist_entry *he)
315 u64 prev_period = he->stat.period;
321 he_stat__decay(&he->stat);
323 he_stat__decay(he->stat_acc);
324 decay_callchain(he->callchain);
326 diff = prev_period - he->stat.period;
328 if (!he->depth) {
330 if (!he->filtered)
334 if (!he->leaf) {
336 struct rb_node *node = rb_first_cached(&he->hroot_out);
346 return he->stat.period == 0;
349 static void hists__delete_entry(struct hists *hists, struct hist_entry *he)
354 if (he->parent_he) {
355 root_in = &he->parent_he->hroot_in;
356 root_out = &he->parent_he->hroot_out;
365 rb_erase_cached(&he->rb_node_in, root_in);
366 rb_erase_cached(&he->rb_node, root_out);
369 if (!he->filtered)
372 hist_entry__delete(he);
426 static int hist_entry__init(struct hist_entry *he,
431 *he = *template;
432 he->callchain_size = callchain_size;
435 he->stat_acc = malloc(sizeof(he->stat));
436 if (he->stat_acc == NULL)
438 memcpy(he->stat_acc, &he->stat, sizeof(he->stat));
440 memset(&he->stat, 0, sizeof(he->stat));
443 map__get(he->ms.map);
445 if (he->branch_info) {
451 he->branch_info = malloc(sizeof(*he->branch_info));
452 if (he->branch_info == NULL)
455 memcpy(he->branch_info, template->branch_info,
456 sizeof(*he->branch_info));
458 map__get(he->branch_info->from.ms.map);
459 map__get(he->branch_info->to.ms.map);
462 if (he->mem_info) {
463 map__get(he->mem_info->iaddr.ms.map);
464 map__get(he->mem_info->daddr.ms.map);
467 if (hist_entry__has_callchains(he) && symbol_conf.use_callchain)
468 callchain_init(he->callchain);
470 if (he->raw_data) {
471 he->raw_data = memdup(he->raw_data, he->raw_size);
472 if (he->raw_data == NULL)
476 if (he->srcline) {
477 he->srcline = strdup(he->srcline);
478 if (he->srcline == NULL)
483 he->res_samples = calloc(sizeof(struct res_sample),
485 if (!he->res_samples)
489 INIT_LIST_HEAD(&he->pairs.node);
490 thread__get(he->thread);
491 he->hroot_in = RB_ROOT_CACHED;
492 he->hroot_out = RB_ROOT_CACHED;
495 he->leaf = true;
500 zfree(&he->srcline);
503 zfree(&he->raw_data);
506 if (he->branch_info) {
507 map__put(he->branch_info->from.ms.map);
508 map__put(he->branch_info->to.ms.map);
509 zfree(&he->branch_info);
511 if (he->mem_info) {
512 map__put(he->mem_info->iaddr.ms.map);
513 map__put(he->mem_info->daddr.ms.map);
516 map__zput(he->ms.map);
517 zfree(&he->stat_acc);
541 struct hist_entry *he;
550 he = ops->new(callchain_size);
551 if (he) {
552 err = hist_entry__init(he, template, sample_self, callchain_size);
554 ops->free(he);
555 he = NULL;
559 return he;
569 static void hist_entry__add_callchain_period(struct hist_entry *he, u64 period)
571 if (!hist_entry__has_callchains(he) || !symbol_conf.use_callchain)
574 he->hists->callchain_period += period;
575 if (!he->filtered)
576 he->hists->callchain_non_filtered_period += period;
586 struct hist_entry *he;
596 he = rb_entry(parent, struct hist_entry, rb_node_in);
604 cmp = hist_entry__cmp(he, entry);
608 he_stat__add_period(&he->stat, period, weight);
609 hist_entry__add_callchain_period(he, period);
612 he_stat__add_period(he->stat_acc, period, weight);
628 if (he->ms.map != entry->ms.map) {
629 map__put(he->ms.map);
630 he->ms.map = map__get(entry->ms.map);
643 he = hist_entry__new(entry, sample_self);
644 if (!he)
648 hist_entry__add_callchain_period(he, period);
651 rb_link_node(&he->rb_node_in, parent, p);
652 rb_insert_color_cached(&he->rb_node_in, hists->entries_in, leftmost);
655 he_stat__add_cpumode_period(&he->stat, al->cpumode, period);
657 he_stat__add_cpumode_period(he->stat_acc, al->cpumode, period);
658 return he;
671 static void hists__res_sample(struct hist_entry *he, struct perf_sample *sample)
676 if (he->num_res < symbol_conf.res_sample) {
677 j = he->num_res++;
681 r = &he->res_samples[j];
734 }, *he = hists__findnew_entry(hists, &entry, al, sample_self);
736 if (!hists->has_callchains && he && he->callchain_size != 0)
738 if (he && symbol_conf.res_sample)
739 hists__res_sample(he, sample);
740 return he;
780 }, *he = hists__findnew_entry(hists, &entry, al, false);
782 return he;
820 struct hist_entry *he;
838 he = hists__add_entry(hists, al, iter->parent, NULL, mi,
840 if (!he)
843 iter->he = he;
853 struct hist_entry *he = iter->he;
856 if (he == NULL)
859 hists__inc_nr_samples(hists, he->filtered);
861 err = hist_entry__append_callchain(he, iter->sample);
871 iter->he = NULL;
925 struct hist_entry *he = NULL;
941 he = hists__add_entry(hists, al, iter->parent, &bi[i], NULL,
943 if (he == NULL)
946 hists__inc_nr_samples(hists, he->filtered);
949 iter->he = he;
959 iter->he = NULL;
976 struct hist_entry *he;
978 he = hists__add_entry(evsel__hists(evsel), al, iter->parent, NULL, NULL,
980 if (he == NULL)
983 iter->he = he;
991 struct hist_entry *he = iter->he;
995 if (he == NULL)
998 iter->he = NULL;
1000 hists__inc_nr_samples(evsel__hists(evsel), he->filtered);
1002 return hist_entry__append_callchain(he, sample);
1036 struct hist_entry *he;
1039 he = hists__add_entry(hists, al, iter->parent, NULL, NULL,
1041 if (he == NULL)
1044 iter->he = he;
1045 he_cache[iter->curr++] = he;
1047 hist_entry__append_callchain(he, sample);
1055 hists__inc_nr_samples(hists, he->filtered);
1094 struct hist_entry *he;
1134 iter->he = NULL;
1139 he = hists__add_entry(evsel__hists(evsel), al, iter->parent, NULL, NULL,
1141 if (he == NULL)
1144 iter->he = he;
1145 he_cache[iter->curr++] = he;
1147 if (hist_entry__has_callchains(he) && symbol_conf.use_callchain)
1148 callchain_append(he->callchain, &cursor, sample->period);
1157 iter->he = NULL;
1218 if (iter->he && iter->add_entry_cb) {
1229 if (iter->he && iter->add_entry_cb) {
1286 void hist_entry__delete(struct hist_entry *he)
1288 struct hist_entry_ops *ops = he->ops;
1290 thread__zput(he->thread);
1291 map__zput(he->ms.map);
1293 if (he->branch_info) {
1294 map__zput(he->branch_info->from.ms.map);
1295 map__zput(he->branch_info->to.ms.map);
1296 free_srcline(he->branch_info->srcline_from);
1297 free_srcline(he->branch_info->srcline_to);
1298 zfree(&he->branch_info);
1301 if (he->mem_info) {
1302 map__zput(he->mem_info->iaddr.ms.map);
1303 map__zput(he->mem_info->daddr.ms.map);
1304 mem_info__zput(he->mem_info);
1307 if (he->block_info)
1308 block_info__zput(he->block_info);
1310 zfree(&he->res_samples);
1311 zfree(&he->stat_acc);
1312 free_srcline(he->srcline);
1313 if (he->srcfile && he->srcfile[0])
1314 zfree(&he->srcfile);
1315 free_callchain(he->callchain);
1316 zfree(&he->trace_output);
1317 zfree(&he->raw_data);
1318 ops->free(he);
1328 int hist_entry__snprintf_alignment(struct hist_entry *he, struct perf_hpp *hpp,
1331 if (!list_is_last(&fmt->list, &he->hists->hpp_list->fields)) {
1332 const int width = fmt->width(fmt, hpp, he->hists);
1346 static void hists__apply_filters(struct hists *hists, struct hist_entry *he);
1347 static void hists__remove_entry_filter(struct hists *hists, struct hist_entry *he,
1357 static void hist_entry__check_and_remove_filter(struct hist_entry *he,
1363 struct hist_entry *parent = he->parent_he;
1390 perf_hpp_list__for_each_format(he->hpp_list, fmt) {
1404 if (!(he->filtered & (1 << type))) {
1421 he->filtered |= (1 << type);
1423 he->filtered |= (parent->filtered & (1 << type));
1427 static void hist_entry__apply_hierarchy_filters(struct hist_entry *he)
1429 hist_entry__check_and_remove_filter(he, HIST_FILTER__THREAD,
1432 hist_entry__check_and_remove_filter(he, HIST_FILTER__DSO,
1435 hist_entry__check_and_remove_filter(he, HIST_FILTER__SYMBOL,
1438 hists__apply_filters(he->hists, he);
1443 struct hist_entry *he,
1460 cmp = fmt->collapse(fmt, iter, he);
1466 he_stat__add_stat(&iter->stat, &he->stat);
1478 new = hist_entry__new(he, true);
1493 he->trace_output = NULL;
1498 he->srcline = NULL;
1503 he->srcfile = NULL;
1515 struct hist_entry *he)
1528 /* insert copy of 'he' for each fmt into the hierarchy */
1529 new_he = hierarchy_insert_entry(hists, root, he, parent, &node->hpp);
1548 he->callchain) < 0)
1553 /* 'he' is no longer used */
1554 hist_entry__delete(he);
1562 struct hist_entry *he)
1571 return hists__hierarchy_insert_entry(hists, root, he);
1577 cmp = hist_entry__collapse(iter, he);
1582 he_stat__add_stat(&iter->stat, &he->stat);
1584 he_stat__add_stat(iter->stat_acc, he->stat_acc);
1586 if (hist_entry__has_callchains(he) && symbol_conf.use_callchain) {
1590 he->callchain) < 0)
1593 hist_entry__delete(he);
1606 rb_link_node(&he->rb_node_in, parent, p);
1607 rb_insert_color_cached(&he->rb_node_in, root, leftmost);
1626 static void hists__apply_filters(struct hists *hists, struct hist_entry *he)
1628 hists__filter_entry_by_dso(hists, he);
1629 hists__filter_entry_by_thread(hists, he);
1630 hists__filter_entry_by_symbol(hists, he);
1631 hists__filter_entry_by_socket(hists, he);
1725 struct hist_entry *he;
1738 he = rb_entry(node, struct hist_entry, rb_node);
1741 hists->stats.total_period += he->stat.period;
1742 if (!he->filtered)
1743 hists->stats.total_non_filtered_period += he->stat.period;
1748 struct hist_entry *he)
1760 if (hist_entry__sort(he, iter) > 0)
1768 rb_link_node(&he->rb_node, parent, p);
1769 rb_insert_color_cached(&he->rb_node, root, leftmost);
1772 perf_hpp_list__for_each_sort_list(he->hpp_list, fmt) {
1774 fmt->sort(fmt, he, NULL);
1786 struct hist_entry *he;
1792 he = rb_entry(node, struct hist_entry, rb_node_in);
1795 hierarchy_insert_output_entry(root_out, he);
1801 if (!he->filtered) {
1803 hists__calc_col_len(hists, he);
1806 if (!he->leaf) {
1808 &he->hroot_in,
1809 &he->hroot_out,
1819 u64 total = he->stat.period;
1822 total = he->stat_acc->period;
1827 callchain_param.sort(&he->sorted_chain, he->callchain,
1833 struct hist_entry *he,
1845 u64 total = he->stat.period;
1848 total = he->stat_acc->period;
1852 callchain_param.sort(&he->sorted_chain, he->callchain,
1860 if (hist_entry__sort(he, iter) > 0)
1868 rb_link_node(&he->rb_node, parent, p);
1869 rb_insert_color_cached(&he->rb_node, entries, leftmost);
1873 perf_hpp__defined_dynamic_entry(fmt, he->hists))
1874 fmt->sort(fmt, he, NULL); /* update column width */
1964 static bool can_goto_child(struct hist_entry *he, enum hierarchy_move_dir hmd)
1966 if (he->leaf || hmd == HMD_FORCE_SIBLING)
1969 if (he->unfolded || hmd == HMD_FORCE_CHILD)
1977 struct hist_entry *he = rb_entry(node, struct hist_entry, rb_node);
1979 while (can_goto_child(he, HMD_NORMAL)) {
1980 node = rb_last(&he->hroot_out.rb_root);
1981 he = rb_entry(node, struct hist_entry, rb_node);
1988 struct hist_entry *he = rb_entry(node, struct hist_entry, rb_node);
1990 if (can_goto_child(he, hmd))
1991 node = rb_first_cached(&he->hroot_out);
1996 he = he->parent_he;
1997 if (he == NULL)
2000 node = rb_next(&he->rb_node);
2007 struct hist_entry *he = rb_entry(node, struct hist_entry, rb_node);
2013 he = he->parent_he;
2014 if (he == NULL)
2017 return &he->rb_node;
2020 bool hist_entry__has_hierarchy_children(struct hist_entry *he, float limit)
2026 if (he->leaf)
2029 node = rb_first_cached(&he->hroot_out);
2088 struct hist_entry *he)
2091 (he->ms.map == NULL || he->ms.map->dso != hists->dso_filter)) {
2092 he->filtered |= (1 << HIST_FILTER__DSO);
2100 struct hist_entry *he)
2103 he->thread != hists->thread_filter) {
2104 he->filtered |= (1 << HIST_FILTER__THREAD);
2112 struct hist_entry *he)
2115 (!he->ms.sym || strstr(he->ms.sym->name,
2117 he->filtered |= (1 << HIST_FILTER__SYMBOL);
2125 struct hist_entry *he)
2128 (he->socket != hists->socket_filter)) {
2129 he->filtered |= (1 << HIST_FILTER__SOCKET);
2136 typedef bool (*filter_fn_t)(struct hists *hists, struct hist_entry *he);
2158 struct hist_entry *he)
2171 if (hist_entry__sort(he, iter) > 0)
2179 rb_link_node(&he->rb_node, parent, p);
2180 rb_insert_color_cached(&he->rb_node, root, leftmost);
2182 if (he->leaf || he->filtered)
2185 nd = rb_first_cached(&he->hroot_out);
2190 rb_erase_cached(&h->rb_node, &he->hroot_out);
2195 he->hroot_out = new_root;
2329 struct hist_entry *he;
2342 he = rb_entry(parent, struct hist_entry, rb_node_in);
2344 cmp = hist_entry__collapse(he, pair);
2357 he = hist_entry__new(pair, true);
2358 if (he) {
2359 memset(&he->stat, 0, sizeof(he->stat));
2360 he->hists = hists;
2362 memset(he->stat_acc, 0, sizeof(he->stat));
2363 rb_link_node(&he->rb_node_in, parent, p);
2364 rb_insert_color_cached(&he->rb_node_in, root, leftmost);
2365 hists__inc_stats(hists, he);
2366 he->dummy = true;
2369 return he;
2378 struct hist_entry *he;
2387 he = rb_entry(parent, struct hist_entry, rb_node_in);
2389 perf_hpp_list__for_each_sort_list(he->hpp_list, fmt) {
2390 cmp = fmt->collapse(fmt, he, pair);
2405 he = hist_entry__new(pair, true);
2406 if (he) {
2407 rb_link_node(&he->rb_node_in, parent, p);
2408 rb_insert_color_cached(&he->rb_node_in, root, leftmost);
2410 he->dummy = true;
2411 he->hists = hists;
2412 memset(&he->stat, 0, sizeof(he->stat));
2413 hists__inc_stats(hists, he);
2416 return he;
2420 struct hist_entry *he)
2431 int64_t cmp = hist_entry__collapse(iter, he);
2445 struct hist_entry *he)
2455 perf_hpp_list__for_each_sort_list(he->hpp_list, fmt) {
2456 cmp = fmt->collapse(fmt, iter, he);
2800 struct hist_entry *he;
2806 he = rb_entry(node, struct hist_entry, rb_node_in);
2807 hist_entry__delete(he);