Lines Matching +full:child +full:- +full:node
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2009-2011, Frederic Weisbecker <fweisbec@gmail.com>
5 * Handle the callchains from the stream in an ad-hoc radix tree and then
45 * -e cycles/call-graph=dwarf/
78 return -1; in parse_callchain_mode()
93 return -1; in parse_callchain_order()
114 return -1; in parse_callchain_sort_key()
131 return -1; in parse_callchain_value()
157 return -1; in get_stack_size()
187 /* parsing ok - move on to the next */ in __parse_callchain_report_opt()
207 return -1; in __parse_callchain_report_opt()
214 return -1; in __parse_callchain_report_opt()
220 return -1; in __parse_callchain_report_opt()
228 return -1; in __parse_callchain_report_opt()
247 int ret = -1; in parse_callchain_record()
252 return -ENOMEM; in parse_callchain_record()
263 param->record_mode = CALLCHAIN_FP; in parse_callchain_record()
267 "needed for --call-graph fp\n"); in parse_callchain_record()
275 param->record_mode = CALLCHAIN_DWARF; in parse_callchain_record()
276 param->dump_size = default_stack_dump_size; in parse_callchain_record()
284 param->dump_size = size; in parse_callchain_record()
288 param->record_mode = CALLCHAIN_LBR; in parse_callchain_record()
292 "needed for --call-graph lbr\n"); in parse_callchain_record()
295 pr_err("callchain: Unknown --call-graph option " in parse_callchain_record()
310 if (!strstarts(var, "call-graph.")) in perf_callchain_config()
312 var += sizeof("call-graph.") - 1; in perf_callchain_config()
314 if (!strcmp(var, "record-mode")) in perf_callchain_config()
316 if (!strcmp(var, "dump-size")) { in perf_callchain_config()
325 if (!strcmp(var, "print-type")){ in perf_callchain_config()
328 if (ret == -1) in perf_callchain_config()
335 if (ret == -1) in perf_callchain_config()
339 if (!strcmp(var, "sort-key")){ in perf_callchain_config()
342 if (ret == -1) in perf_callchain_config()
350 return -1; in perf_callchain_config()
353 if (!strcmp(var, "print-limit")) { in perf_callchain_config()
357 return -1; in perf_callchain_config()
368 struct rb_node **p = &root->rb_node; in rb_insert_callchain()
383 if (rnode->hit < chain->hit) in rb_insert_callchain()
384 p = &(*p)->rb_left; in rb_insert_callchain()
386 p = &(*p)->rb_right; in rb_insert_callchain()
391 p = &(*p)->rb_left; in rb_insert_callchain()
393 p = &(*p)->rb_right; in rb_insert_callchain()
401 rb_link_node(&chain->rb_node, parent, p); in rb_insert_callchain()
402 rb_insert_color(&chain->rb_node, root); in rb_insert_callchain()
406 __sort_chain_flat(struct rb_root *rb_root, struct callchain_node *node, in __sort_chain_flat() argument
410 struct callchain_node *child; in __sort_chain_flat() local
412 n = rb_first(&node->rb_root_in); in __sort_chain_flat()
414 child = rb_entry(n, struct callchain_node, rb_node_in); in __sort_chain_flat()
417 __sort_chain_flat(rb_root, child, min_hit); in __sort_chain_flat()
420 if (node->hit && node->hit >= min_hit) in __sort_chain_flat()
421 rb_insert_callchain(rb_root, node, CHAIN_FLAT); in __sort_chain_flat()
433 __sort_chain_flat(rb_root, &root->node, min_hit); in sort_chain_flat()
436 static void __sort_chain_graph_abs(struct callchain_node *node, in __sort_chain_graph_abs() argument
440 struct callchain_node *child; in __sort_chain_graph_abs() local
442 node->rb_root = RB_ROOT; in __sort_chain_graph_abs()
443 n = rb_first(&node->rb_root_in); in __sort_chain_graph_abs()
446 child = rb_entry(n, struct callchain_node, rb_node_in); in __sort_chain_graph_abs()
449 __sort_chain_graph_abs(child, min_hit); in __sort_chain_graph_abs()
450 if (callchain_cumul_hits(child) >= min_hit) in __sort_chain_graph_abs()
451 rb_insert_callchain(&node->rb_root, child, in __sort_chain_graph_abs()
460 __sort_chain_graph_abs(&chain_root->node, min_hit); in sort_chain_graph_abs()
461 rb_root->rb_node = chain_root->node.rb_root.rb_node; in sort_chain_graph_abs()
464 static void __sort_chain_graph_rel(struct callchain_node *node, in __sort_chain_graph_rel() argument
468 struct callchain_node *child; in __sort_chain_graph_rel() local
471 node->rb_root = RB_ROOT; in __sort_chain_graph_rel()
472 min_hit = ceil(node->children_hit * min_percent); in __sort_chain_graph_rel()
474 n = rb_first(&node->rb_root_in); in __sort_chain_graph_rel()
476 child = rb_entry(n, struct callchain_node, rb_node_in); in __sort_chain_graph_rel()
479 __sort_chain_graph_rel(child, min_percent); in __sort_chain_graph_rel()
480 if (callchain_cumul_hits(child) >= min_hit) in __sort_chain_graph_rel()
481 rb_insert_callchain(&node->rb_root, child, in __sort_chain_graph_rel()
490 __sort_chain_graph_rel(&chain_root->node, param->min_percent / 100.0); in sort_chain_graph_rel()
491 rb_root->rb_node = chain_root->node.rb_root.rb_node; in sort_chain_graph_rel()
496 switch (param->mode) { in callchain_register_param()
498 param->sort = sort_chain_graph_abs; in callchain_register_param()
501 param->sort = sort_chain_graph_rel; in callchain_register_param()
505 param->sort = sort_chain_flat; in callchain_register_param()
509 return -1; in callchain_register_param()
515 * Create a child for a parent. If inherit_children, then the new child
525 perror("not enough memory to create child for code path tree"); in create_child()
528 new->parent = parent; in create_child()
529 INIT_LIST_HEAD(&new->val); in create_child()
530 INIT_LIST_HEAD(&new->parent_val); in create_child()
534 struct callchain_node *child; in create_child() local
536 new->rb_root_in = parent->rb_root_in; in create_child()
537 parent->rb_root_in = RB_ROOT; in create_child()
539 n = rb_first(&new->rb_root_in); in create_child()
541 child = rb_entry(n, struct callchain_node, rb_node_in); in create_child()
542 child->parent = new; in create_child()
546 /* make it the first child */ in create_child()
547 rb_link_node(&new->rb_node_in, NULL, &parent->rb_root_in.rb_node); in create_child()
548 rb_insert_color(&new->rb_node_in, &parent->rb_root_in); in create_child()
556 * Fill the node with callchain values
559 fill_node(struct callchain_node *node, struct callchain_cursor *cursor) in fill_node() argument
563 node->val_nr = cursor->nr - cursor->pos; in fill_node()
564 if (!node->val_nr) in fill_node()
565 pr_warning("Warning: empty node in callchain tree\n"); in fill_node()
575 return -1; in fill_node()
577 call->ip = cursor_node->ip; in fill_node()
578 call->ms.sym = cursor_node->sym; in fill_node()
579 call->ms.map = map__get(cursor_node->map); in fill_node()
580 call->srcline = cursor_node->srcline; in fill_node()
582 if (cursor_node->branch) { in fill_node()
583 call->branch_count = 1; in fill_node()
585 if (cursor_node->branch_from) { in fill_node()
590 call->brtype_stat.branch_to = true; in fill_node()
592 if (cursor_node->branch_flags.predicted) in fill_node()
593 call->predicted_count = 1; in fill_node()
595 if (cursor_node->branch_flags.abort) in fill_node()
596 call->abort_count = 1; in fill_node()
598 branch_type_count(&call->brtype_stat, in fill_node()
599 &cursor_node->branch_flags, in fill_node()
600 cursor_node->branch_from, in fill_node()
601 cursor_node->ip); in fill_node()
606 call->brtype_stat.branch_to = false; in fill_node()
607 call->cycles_count = in fill_node()
608 cursor_node->branch_flags.cycles; in fill_node()
609 call->iter_count = cursor_node->nr_loop_iter; in fill_node()
610 call->iter_cycles = cursor_node->iter_cycles; in fill_node()
614 list_add_tail(&call->list, &node->val); in fill_node()
636 list_for_each_entry_safe(call, tmp, &new->val, list) { in add_child()
637 list_del(&call->list); in add_child()
638 map__zput(call->ms.map); in add_child()
645 new->children_hit = 0; in add_child()
646 new->hit = period; in add_child()
647 new->children_count = 0; in add_child()
648 new->count = 1; in add_child()
653 MATCH_ERROR = -1,
670 cmp = -1; in match_chain_strings()
686 * to compare just relative addresses. -acme
691 struct dso *left_dso = left_map ? left_map->dso : NULL; in match_chain_dso_addresses()
692 struct dso *right_dso = right_map ? right_map->dso : NULL; in match_chain_dso_addresses()
703 static enum match_result match_chain(struct callchain_cursor_node *node, in match_chain() argument
710 match = match_chain_strings(cnode->srcline, node->srcline); in match_chain()
713 /* otherwise fall-back to symbol-based comparison below */ in match_chain()
716 if (node->sym && cnode->ms.sym) { in match_chain()
723 if (cnode->ms.sym->inlined || node->sym->inlined) { in match_chain()
724 match = match_chain_strings(cnode->ms.sym->name, in match_chain()
725 node->sym->name); in match_chain()
729 match = match_chain_dso_addresses(cnode->ms.map, cnode->ms.sym->start, in match_chain()
730 node->map, node->sym->start); in match_chain()
734 /* otherwise fall-back to IP-based comparison below */ in match_chain()
738 match = match_chain_dso_addresses(cnode->ms.map, cnode->ip, node->map, node->ip); in match_chain()
742 if (match == MATCH_EQ && node->branch) { in match_chain()
743 cnode->branch_count++; in match_chain()
745 if (node->branch_from) { in match_chain()
749 cnode->brtype_stat.branch_to = true; in match_chain()
751 if (node->branch_flags.predicted) in match_chain()
752 cnode->predicted_count++; in match_chain()
754 if (node->branch_flags.abort) in match_chain()
755 cnode->abort_count++; in match_chain()
757 branch_type_count(&cnode->brtype_stat, in match_chain()
758 &node->branch_flags, in match_chain()
759 node->branch_from, in match_chain()
760 node->ip); in match_chain()
765 cnode->brtype_stat.branch_to = false; in match_chain()
766 cnode->cycles_count += node->branch_flags.cycles; in match_chain()
767 cnode->iter_count += node->nr_loop_iter; in match_chain()
768 cnode->iter_cycles += node->iter_cycles; in match_chain()
769 cnode->from_count++; in match_chain()
777 * Split the parent in two parts (a new child is created) and
778 * give a part of its callchain to the created child.
779 * Then create another child to host the given callchain of new branch
794 return -1; in split_add_child()
796 /* split the callchain and move a part to the new child */ in split_add_child()
797 old_tail = parent->val.prev; in split_add_child()
798 list_del_range(&to_split->list, old_tail); in split_add_child()
799 new->val.next = &to_split->list; in split_add_child()
800 new->val.prev = old_tail; in split_add_child()
801 to_split->list.prev = &new->val; in split_add_child()
802 old_tail->next = &new->val; in split_add_child()
805 new->hit = parent->hit; in split_add_child()
806 new->children_hit = parent->children_hit; in split_add_child()
807 parent->children_hit = callchain_cumul_hits(new); in split_add_child()
808 new->val_nr = parent->val_nr - idx_local; in split_add_child()
809 parent->val_nr = idx_local; in split_add_child()
810 new->count = parent->count; in split_add_child()
811 new->children_count = parent->children_count; in split_add_child()
812 parent->children_count = callchain_cumul_counts(new); in split_add_child()
814 /* create a new child for the new branch if any */ in split_add_child()
815 if (idx_total < cursor->nr) { in split_add_child()
818 struct callchain_cursor_node *node; in split_add_child() local
821 parent->hit = 0; in split_add_child()
822 parent->children_hit += period; in split_add_child()
823 parent->count = 0; in split_add_child()
824 parent->children_count += 1; in split_add_child()
826 node = callchain_cursor_current(cursor); in split_add_child()
829 return -1; in split_add_child()
832 * This is second child since we moved parent's children in split_add_child()
833 * to new (first) child above. in split_add_child()
835 p = parent->rb_root_in.rb_node; in split_add_child()
837 cnode = list_first_entry(&first->val, struct callchain_list, in split_add_child()
840 if (match_chain(node, cnode) == MATCH_LT) in split_add_child()
841 pp = &p->rb_left; in split_add_child()
843 pp = &p->rb_right; in split_add_child()
845 rb_link_node(&new->rb_node_in, p, pp); in split_add_child()
846 rb_insert_color(&new->rb_node_in, &parent->rb_root_in); in split_add_child()
848 parent->hit = period; in split_add_child()
849 parent->count = 1; in split_add_child()
865 struct callchain_cursor_node *node; in append_chain_children() local
866 struct rb_node **p = &root->rb_root_in.rb_node; in append_chain_children()
869 node = callchain_cursor_current(cursor); in append_chain_children()
870 if (!node) in append_chain_children()
871 return -1; in append_chain_children()
885 return -1; in append_chain_children()
888 p = &parent->rb_left; in append_chain_children()
890 p = &parent->rb_right; in append_chain_children()
892 /* nothing in children, add to the current node */ in append_chain_children()
895 return -1; in append_chain_children()
897 rb_link_node(&rnode->rb_node_in, parent, p); in append_chain_children()
898 rb_insert_color(&rnode->rb_node_in, &root->rb_root_in); in append_chain_children()
901 root->children_hit += period; in append_chain_children()
902 root->children_count++; in append_chain_children()
912 u64 start = cursor->pos; in append_chain()
918 * Lookup in the current node in append_chain()
923 list_for_each_entry(cnode, &root->val, list) { in append_chain()
924 struct callchain_cursor_node *node; in append_chain() local
926 node = callchain_cursor_current(cursor); in append_chain()
927 if (!node) in append_chain()
930 cmp = match_chain(node, cnode); in append_chain()
945 matches = cursor->pos - start; in append_chain()
947 /* we match only a part of the node. Split it and add the new chain */ in append_chain()
948 if (matches < root->val_nr) { in append_chain()
957 if (matches == root->val_nr && cursor->pos == cursor->nr) { in append_chain()
958 root->hit += period; in append_chain()
959 root->count++; in append_chain()
963 /* We match the node and still have a part remaining */ in append_chain()
974 if (!cursor->nr) in callchain_append()
979 if (append_chain_children(&root->node, cursor, period) < 0) in callchain_append()
980 return -1; in callchain_append()
982 if (cursor->nr > root->max_depth) in callchain_append()
983 root->max_depth = cursor->nr; in callchain_append()
992 struct callchain_cursor_node **old_last = cursor->last; in merge_chain_branch()
993 struct callchain_node *child; in merge_chain_branch() local
996 int old_pos = cursor->nr; in merge_chain_branch()
999 list_for_each_entry_safe(list, next_list, &src->val, list) { in merge_chain_branch()
1000 callchain_cursor_append(cursor, list->ip, in merge_chain_branch()
1001 list->ms.map, list->ms.sym, in merge_chain_branch()
1002 false, NULL, 0, 0, 0, list->srcline); in merge_chain_branch()
1003 list_del(&list->list); in merge_chain_branch()
1004 map__zput(list->ms.map); in merge_chain_branch()
1008 if (src->hit) { in merge_chain_branch()
1010 if (append_chain_children(dst, cursor, src->hit) < 0) in merge_chain_branch()
1011 return -1; in merge_chain_branch()
1014 n = rb_first(&src->rb_root_in); in merge_chain_branch()
1016 child = container_of(n, struct callchain_node, rb_node_in); in merge_chain_branch()
1018 rb_erase(&child->rb_node_in, &src->rb_root_in); in merge_chain_branch()
1020 err = merge_chain_branch(cursor, dst, child); in merge_chain_branch()
1024 free(child); in merge_chain_branch()
1027 cursor->nr = old_pos; in merge_chain_branch()
1028 cursor->last = old_last; in merge_chain_branch()
1036 return merge_chain_branch(cursor, &dst->node, &src->node); in callchain_merge()
1045 struct callchain_cursor_node *node = *cursor->last; in callchain_cursor_append() local
1047 if (!node) { in callchain_cursor_append()
1048 node = calloc(1, sizeof(*node)); in callchain_cursor_append()
1049 if (!node) in callchain_cursor_append()
1050 return -ENOMEM; in callchain_cursor_append()
1052 *cursor->last = node; in callchain_cursor_append()
1055 node->ip = ip; in callchain_cursor_append()
1056 map__zput(node->map); in callchain_cursor_append()
1057 node->map = map__get(map); in callchain_cursor_append()
1058 node->sym = sym; in callchain_cursor_append()
1059 node->branch = branch; in callchain_cursor_append()
1060 node->nr_loop_iter = nr_loop_iter; in callchain_cursor_append()
1061 node->iter_cycles = iter_cycles; in callchain_cursor_append()
1062 node->srcline = srcline; in callchain_cursor_append()
1065 memcpy(&node->branch_flags, flags, in callchain_cursor_append()
1068 node->branch_from = branch_from; in callchain_cursor_append()
1069 cursor->nr++; in callchain_cursor_append()
1071 cursor->last = &node->next; in callchain_cursor_append()
1081 if (sample->callchain == NULL && !symbol_conf.show_branchflag_count) in sample__resolve_callchain()
1086 return thread__resolve_callchain(al->thread, cursor, evsel, sample, in sample__resolve_callchain()
1094 if ((!symbol_conf.use_callchain || sample->callchain == NULL) && in hist_entry__append_callchain()
1097 return callchain_append(he->callchain, &callchain_cursor, sample->period); in hist_entry__append_callchain()
1100 int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node *node, in fill_callchain_info() argument
1103 al->map = node->map; in fill_callchain_info()
1104 al->sym = node->sym; in fill_callchain_info()
1105 al->srcline = node->srcline; in fill_callchain_info()
1106 al->addr = node->ip; in fill_callchain_info()
1108 if (al->sym == NULL) { in fill_callchain_info()
1111 if (al->map == NULL) in fill_callchain_info()
1115 if (al->map->groups == &al->machine->kmaps) { in fill_callchain_info()
1116 if (machine__is_host(al->machine)) { in fill_callchain_info()
1117 al->cpumode = PERF_RECORD_MISC_KERNEL; in fill_callchain_info()
1118 al->level = 'k'; in fill_callchain_info()
1120 al->cpumode = PERF_RECORD_MISC_GUEST_KERNEL; in fill_callchain_info()
1121 al->level = 'g'; in fill_callchain_info()
1124 if (machine__is_host(al->machine)) { in fill_callchain_info()
1125 al->cpumode = PERF_RECORD_MISC_USER; in fill_callchain_info()
1126 al->level = '.'; in fill_callchain_info()
1128 al->cpumode = PERF_RECORD_MISC_GUEST_USER; in fill_callchain_info()
1129 al->level = 'u'; in fill_callchain_info()
1131 al->cpumode = PERF_RECORD_MISC_HYPERVISOR; in fill_callchain_info()
1132 al->level = 'H'; in fill_callchain_info()
1147 if (cl->ms.sym) { in callchain_list__sym_name()
1148 const char *inlined = cl->ms.sym->inlined ? " (inlined)" : ""; in callchain_list__sym_name()
1150 if (show_srcline && cl->srcline) in callchain_list__sym_name()
1152 cl->ms.sym->name, cl->srcline, in callchain_list__sym_name()
1156 cl->ms.sym->name, inlined); in callchain_list__sym_name()
1158 printed = scnprintf(bf, bfsize, "%#" PRIx64, cl->ip); in callchain_list__sym_name()
1161 scnprintf(bf + printed, bfsize - printed, " %s", in callchain_list__sym_name()
1162 cl->ms.map ? in callchain_list__sym_name()
1163 cl->ms.map->dso->short_name : in callchain_list__sym_name()
1169 char *callchain_node__scnprintf_value(struct callchain_node *node, in callchain_node__scnprintf_value() argument
1173 u64 period = callchain_cumul_hits(node); in callchain_node__scnprintf_value()
1174 unsigned count = callchain_cumul_counts(node); in callchain_node__scnprintf_value()
1177 period = node->hit; in callchain_node__scnprintf_value()
1178 count = node->count; in callchain_node__scnprintf_value()
1198 int callchain_node__fprintf_value(struct callchain_node *node, in callchain_node__fprintf_value() argument
1202 u64 period = callchain_cumul_hits(node); in callchain_node__fprintf_value()
1203 unsigned count = callchain_cumul_counts(node); in callchain_node__fprintf_value()
1206 period = node->hit; in callchain_node__fprintf_value()
1207 count = node->count; in callchain_node__fprintf_value()
1224 static void callchain_counts_value(struct callchain_node *node, in callchain_counts_value() argument
1230 list_for_each_entry(clist, &node->val, list) { in callchain_counts_value()
1232 *branch_count += clist->branch_count; in callchain_counts_value()
1235 *predicted_count += clist->predicted_count; in callchain_counts_value()
1238 *abort_count += clist->abort_count; in callchain_counts_value()
1241 *cycles_count += clist->cycles_count; in callchain_counts_value()
1245 static int callchain_node_branch_counts_cumul(struct callchain_node *node, in callchain_node_branch_counts_cumul() argument
1251 struct callchain_node *child; in callchain_node_branch_counts_cumul() local
1254 n = rb_first(&node->rb_root_in); in callchain_node_branch_counts_cumul()
1256 child = rb_entry(n, struct callchain_node, rb_node_in); in callchain_node_branch_counts_cumul()
1259 callchain_node_branch_counts_cumul(child, branch_count, in callchain_node_branch_counts_cumul()
1264 callchain_counts_value(child, branch_count, in callchain_node_branch_counts_cumul()
1288 return callchain_node_branch_counts_cumul(&root->node, in callchain_branch_counts()
1331 bf + printed, bfsize - printed, 0.0); in branch_to_str()
1337 bf + printed, bfsize - printed, 0.1); in branch_to_str()
1341 printed += scnprintf(bf + printed, bfsize - printed, ")"); in branch_to_str()
1358 bf + printed, bfsize - printed); in branch_from_str()
1365 v, bf + printed, bfsize - printed); in branch_from_str()
1369 bf + printed, bfsize - printed); in branch_from_str()
1374 printed += scnprintf(bf + printed, bfsize - printed, ")"); in branch_from_str()
1391 if (brtype_stat->branch_to) { in counts_str_build()
1433 branch_count = clist->branch_count; in callchain_list_counts__printf_value()
1434 predicted_count = clist->predicted_count; in callchain_list_counts__printf_value()
1435 abort_count = clist->abort_count; in callchain_list_counts__printf_value()
1436 cycles_count = clist->cycles_count; in callchain_list_counts__printf_value()
1437 iter_count = clist->iter_count; in callchain_list_counts__printf_value()
1438 iter_cycles = clist->iter_cycles; in callchain_list_counts__printf_value()
1439 from_count = clist->from_count; in callchain_list_counts__printf_value()
1444 from_count, &clist->brtype_stat); in callchain_list_counts__printf_value()
1447 static void free_callchain_node(struct callchain_node *node) in free_callchain_node() argument
1450 struct callchain_node *child; in free_callchain_node() local
1453 list_for_each_entry_safe(list, tmp, &node->parent_val, list) { in free_callchain_node()
1454 list_del(&list->list); in free_callchain_node()
1455 map__zput(list->ms.map); in free_callchain_node()
1459 list_for_each_entry_safe(list, tmp, &node->val, list) { in free_callchain_node()
1460 list_del(&list->list); in free_callchain_node()
1461 map__zput(list->ms.map); in free_callchain_node()
1465 n = rb_first(&node->rb_root_in); in free_callchain_node()
1467 child = container_of(n, struct callchain_node, rb_node_in); in free_callchain_node()
1469 rb_erase(&child->rb_node_in, &node->rb_root_in); in free_callchain_node()
1471 free_callchain_node(child); in free_callchain_node()
1472 free(child); in free_callchain_node()
1481 free_callchain_node(&root->node); in free_callchain()
1484 static u64 decay_callchain_node(struct callchain_node *node) in decay_callchain_node() argument
1486 struct callchain_node *child; in decay_callchain_node() local
1490 n = rb_first(&node->rb_root_in); in decay_callchain_node()
1492 child = container_of(n, struct callchain_node, rb_node_in); in decay_callchain_node()
1494 child_hits += decay_callchain_node(child); in decay_callchain_node()
1498 node->hit = (node->hit * 7) / 8; in decay_callchain_node()
1499 node->children_hit = child_hits; in decay_callchain_node()
1501 return node->hit; in decay_callchain_node()
1509 decay_callchain_node(&root->node); in decay_callchain()
1512 int callchain_node__make_parent_list(struct callchain_node *node) in callchain_node__make_parent_list() argument
1514 struct callchain_node *parent = node->parent; in callchain_node__make_parent_list()
1519 list_for_each_entry_reverse(chain, &parent->val, list) { in callchain_node__make_parent_list()
1524 new->has_children = false; in callchain_node__make_parent_list()
1525 map__get(new->ms.map); in callchain_node__make_parent_list()
1526 list_add_tail(&new->list, &head); in callchain_node__make_parent_list()
1528 parent = parent->parent; in callchain_node__make_parent_list()
1532 list_move_tail(&chain->list, &node->parent_val); in callchain_node__make_parent_list()
1534 if (!list_empty(&node->parent_val)) { in callchain_node__make_parent_list()
1535 chain = list_first_entry(&node->parent_val, struct callchain_list, list); in callchain_node__make_parent_list()
1536 chain->has_children = rb_prev(&node->rb_node) || rb_next(&node->rb_node); in callchain_node__make_parent_list()
1538 chain = list_first_entry(&node->val, struct callchain_list, list); in callchain_node__make_parent_list()
1539 chain->has_children = false; in callchain_node__make_parent_list()
1545 list_del(&chain->list); in callchain_node__make_parent_list()
1546 map__zput(chain->ms.map); in callchain_node__make_parent_list()
1549 return -ENOMEM; in callchain_node__make_parent_list()
1561 struct callchain_cursor_node *node; in callchain_cursor__copy() local
1563 node = callchain_cursor_current(src); in callchain_cursor__copy()
1564 if (node == NULL) in callchain_cursor__copy()
1567 rc = callchain_cursor_append(dst, node->ip, node->map, node->sym, in callchain_cursor__copy()
1568 node->branch, &node->branch_flags, in callchain_cursor__copy()
1569 node->nr_loop_iter, in callchain_cursor__copy()
1570 node->iter_cycles, in callchain_cursor__copy()
1571 node->branch_from, node->srcline); in callchain_cursor__copy()