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 "symbol.h" 8 9 enum chain_mode { 10 CHAIN_FLAT, 11 CHAIN_GRAPH_ABS, 12 CHAIN_GRAPH_REL 13 }; 14 15 struct callchain_node { 16 struct callchain_node *parent; 17 struct list_head brothers; 18 struct list_head children; 19 struct list_head val; 20 struct rb_node rb_node; /* to sort nodes in an rbtree */ 21 struct rb_root rb_root; /* sorted tree of children */ 22 unsigned int val_nr; 23 u64 hit; 24 u64 cumul_hit; /* hit + hits of children */ 25 }; 26 27 struct callchain_param; 28 29 typedef void (*sort_chain_func_t)(struct rb_root *, struct callchain_node *, 30 u64, struct callchain_param *); 31 32 struct callchain_param { 33 enum chain_mode mode; 34 double min_percent; 35 sort_chain_func_t sort; 36 }; 37 38 struct callchain_list { 39 u64 ip; 40 struct symbol *sym; 41 struct list_head list; 42 }; 43 44 static inline void callchain_init(struct callchain_node *node) 45 { 46 INIT_LIST_HEAD(&node->brothers); 47 INIT_LIST_HEAD(&node->children); 48 INIT_LIST_HEAD(&node->val); 49 } 50 51 int register_callchain_param(struct callchain_param *param); 52 void append_chain(struct callchain_node *root, struct ip_callchain *chain, 53 struct symbol **syms); 54 #endif 55