diff options
Diffstat (limited to 'tools/perf/util/thread-stack.h')
| -rw-r--r-- | tools/perf/util/thread-stack.h | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/tools/perf/util/thread-stack.h b/tools/perf/util/thread-stack.h new file mode 100644 index 000000000000..b843bbef8ba2 --- /dev/null +++ b/tools/perf/util/thread-stack.h | |||
| @@ -0,0 +1,111 @@ | |||
| 1 | /* | ||
| 2 | * thread-stack.h: Synthesize a thread's stack using call / return events | ||
| 3 | * Copyright (c) 2014, Intel Corporation. | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify it | ||
| 6 | * under the terms and conditions of the GNU General Public License, | ||
| 7 | * version 2, as published by the Free Software Foundation. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
| 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 12 | * more details. | ||
| 13 | * | ||
| 14 | */ | ||
| 15 | |||
| 16 | #ifndef __PERF_THREAD_STACK_H | ||
| 17 | #define __PERF_THREAD_STACK_H | ||
| 18 | |||
| 19 | #include <sys/types.h> | ||
| 20 | |||
| 21 | #include <linux/types.h> | ||
| 22 | #include <linux/rbtree.h> | ||
| 23 | |||
| 24 | struct thread; | ||
| 25 | struct comm; | ||
| 26 | struct ip_callchain; | ||
| 27 | struct symbol; | ||
| 28 | struct dso; | ||
| 29 | struct call_return_processor; | ||
| 30 | struct comm; | ||
| 31 | struct perf_sample; | ||
| 32 | struct addr_location; | ||
| 33 | |||
| 34 | /* | ||
| 35 | * Call/Return flags. | ||
| 36 | * | ||
| 37 | * CALL_RETURN_NO_CALL: 'return' but no matching 'call' | ||
| 38 | * CALL_RETURN_NO_RETURN: 'call' but no matching 'return' | ||
| 39 | */ | ||
| 40 | enum { | ||
| 41 | CALL_RETURN_NO_CALL = 1 << 0, | ||
| 42 | CALL_RETURN_NO_RETURN = 1 << 1, | ||
| 43 | }; | ||
| 44 | |||
| 45 | /** | ||
| 46 | * struct call_return - paired call/return information. | ||
| 47 | * @thread: thread in which call/return occurred | ||
| 48 | * @comm: comm in which call/return occurred | ||
| 49 | * @cp: call path | ||
| 50 | * @call_time: timestamp of call (if known) | ||
| 51 | * @return_time: timestamp of return (if known) | ||
| 52 | * @branch_count: number of branches seen between call and return | ||
| 53 | * @call_ref: external reference to 'call' sample (e.g. db_id) | ||
| 54 | * @return_ref: external reference to 'return' sample (e.g. db_id) | ||
| 55 | * @db_id: id used for db-export | ||
| 56 | * @flags: Call/Return flags | ||
| 57 | */ | ||
| 58 | struct call_return { | ||
| 59 | struct thread *thread; | ||
| 60 | struct comm *comm; | ||
| 61 | struct call_path *cp; | ||
| 62 | u64 call_time; | ||
| 63 | u64 return_time; | ||
| 64 | u64 branch_count; | ||
| 65 | u64 call_ref; | ||
| 66 | u64 return_ref; | ||
| 67 | u64 db_id; | ||
| 68 | u32 flags; | ||
| 69 | }; | ||
| 70 | |||
| 71 | /** | ||
| 72 | * struct call_path - node in list of calls leading to a function call. | ||
| 73 | * @parent: call path to the parent function call | ||
| 74 | * @sym: symbol of function called | ||
| 75 | * @ip: only if sym is null, the ip of the function | ||
| 76 | * @db_id: id used for db-export | ||
| 77 | * @in_kernel: whether function is a in the kernel | ||
| 78 | * @rb_node: node in parent's tree of called functions | ||
| 79 | * @children: tree of call paths of functions called | ||
| 80 | * | ||
| 81 | * In combination with the call_return structure, the call_path structure | ||
| 82 | * defines a context-sensitve call-graph. | ||
| 83 | */ | ||
| 84 | struct call_path { | ||
| 85 | struct call_path *parent; | ||
| 86 | struct symbol *sym; | ||
| 87 | u64 ip; | ||
| 88 | u64 db_id; | ||
| 89 | bool in_kernel; | ||
| 90 | struct rb_node rb_node; | ||
| 91 | struct rb_root children; | ||
| 92 | }; | ||
| 93 | |||
| 94 | int thread_stack__event(struct thread *thread, u32 flags, u64 from_ip, | ||
| 95 | u64 to_ip, u16 insn_len, u64 trace_nr); | ||
| 96 | void thread_stack__set_trace_nr(struct thread *thread, u64 trace_nr); | ||
| 97 | void thread_stack__sample(struct thread *thread, struct ip_callchain *chain, | ||
| 98 | size_t sz, u64 ip); | ||
| 99 | void thread_stack__free(struct thread *thread); | ||
| 100 | |||
| 101 | struct call_return_processor * | ||
| 102 | call_return_processor__new(int (*process)(struct call_return *cr, void *data), | ||
| 103 | void *data); | ||
| 104 | void call_return_processor__free(struct call_return_processor *crp); | ||
| 105 | int thread_stack__process(struct thread *thread, struct comm *comm, | ||
| 106 | struct perf_sample *sample, | ||
| 107 | struct addr_location *from_al, | ||
| 108 | struct addr_location *to_al, u64 ref, | ||
| 109 | struct call_return_processor *crp); | ||
| 110 | |||
| 111 | #endif | ||
