1 #ifndef __PERF_CALLCHAIN_H 2 #define __PERF_CALLCHAIN_H 3 4 #include "../perf.h" 5 #include <linux/list.h> 6 #include <linux/rbtree.h> 7 #include "event.h" 8 #include "util.h" 9 #include "symbol.h" 10 11 enum chain_mode { 12 CHAIN_NONE, 13 CHAIN_FLAT, 14 CHAIN_GRAPH_ABS, 15 CHAIN_GRAPH_REL 16 }; 17 18 struct callchain_node { 19 struct callchain_node *parent; 20 struct list_head brothers; 21 struct list_head children; 22 struct list_head val; 23 struct rb_node rb_node; /* to sort nodes in an rbtree */ 24 struct rb_root rb_root; /* sorted tree of children */ 25 unsigned int val_nr; 26 u64 hit; 27 u64 children_hit; 28 }; 29 30 struct callchain_param; 31 32 typedef void (*sort_chain_func_t)(struct rb_root *, struct callchain_node *, 33 u64, struct callchain_param *); 34 35 struct callchain_param { 36 enum chain_mode mode; 37 u32 print_limit; 38 double min_percent; 39 sort_chain_func_t sort; 40 }; 41 42 struct callchain_list { 43 u64 ip; 44 struct map_symbol ms; 45 struct list_head list; 46 }; 47 48 static inline void callchain_init(struct callchain_node *node) 49 { 50 INIT_LIST_HEAD(&node->brothers); 51 INIT_LIST_HEAD(&node->children); 52 INIT_LIST_HEAD(&node->val); 53 } 54 55 static inline u64 cumul_hits(struct callchain_node *node) 56 { 57 return node->hit + node->children_hit; 58 } 59 60 int register_callchain_param(struct callchain_param *param); 61 int append_chain(struct callchain_node *root, struct ip_callchain *chain, 62 struct map_symbol *syms); 63 64 bool ip_callchain__valid(struct ip_callchain *chain, event_t *event); 65 #endif /* __PERF_CALLCHAIN_H */ 66