mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
perf tools: Enhance the thread stack to output call/return data
Enhance the thread stack to output detailed information about paired calls and returns. The enhanced processing consumes sample information via thread_stack__process() and outputs information about paired calls / returns via a call-back. While the call-back makes it possible for the facility to be used by arbitrary tools, a subsequent patch will provide the information to Python scripting via the db-export interface. An important part of the call/return information is the call path which provides a structure that defines a context sensitive call graph. Note that there are now two ways to use the thread stack. For simply providing a call stack (like you would get from the perf record -g option) the interface consists of thread_stack__event() and thread_stack__sample(). Whereas the enhanced interface consists of call_return_processor__new() and thread_stack__process(). Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1414678188-14946-5-git-send-email-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
00447ccdf3
commit
92a9e4f7db
2 changed files with 661 additions and 7 deletions
|
@ -19,14 +19,93 @@
|
|||
#include <sys/types.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/rbtree.h>
|
||||
|
||||
struct thread;
|
||||
struct comm;
|
||||
struct ip_callchain;
|
||||
struct symbol;
|
||||
struct dso;
|
||||
struct call_return_processor;
|
||||
struct comm;
|
||||
struct perf_sample;
|
||||
struct addr_location;
|
||||
|
||||
/*
|
||||
* Call/Return flags.
|
||||
*
|
||||
* CALL_RETURN_NO_CALL: 'return' but no matching 'call'
|
||||
* CALL_RETURN_NO_RETURN: 'call' but no matching 'return'
|
||||
*/
|
||||
enum {
|
||||
CALL_RETURN_NO_CALL = 1 << 0,
|
||||
CALL_RETURN_NO_RETURN = 1 << 1,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct call_return - paired call/return information.
|
||||
* @thread: thread in which call/return occurred
|
||||
* @comm: comm in which call/return occurred
|
||||
* @cp: call path
|
||||
* @call_time: timestamp of call (if known)
|
||||
* @return_time: timestamp of return (if known)
|
||||
* @branch_count: number of branches seen between call and return
|
||||
* @call_ref: external reference to 'call' sample (e.g. db_id)
|
||||
* @return_ref: external reference to 'return' sample (e.g. db_id)
|
||||
* @db_id: id used for db-export
|
||||
* @flags: Call/Return flags
|
||||
*/
|
||||
struct call_return {
|
||||
struct thread *thread;
|
||||
struct comm *comm;
|
||||
struct call_path *cp;
|
||||
u64 call_time;
|
||||
u64 return_time;
|
||||
u64 branch_count;
|
||||
u64 call_ref;
|
||||
u64 return_ref;
|
||||
u64 db_id;
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct call_path - node in list of calls leading to a function call.
|
||||
* @parent: call path to the parent function call
|
||||
* @sym: symbol of function called
|
||||
* @ip: only if sym is null, the ip of the function
|
||||
* @db_id: id used for db-export
|
||||
* @in_kernel: whether function is a in the kernel
|
||||
* @rb_node: node in parent's tree of called functions
|
||||
* @children: tree of call paths of functions called
|
||||
*
|
||||
* In combination with the call_return structure, the call_path structure
|
||||
* defines a context-sensitve call-graph.
|
||||
*/
|
||||
struct call_path {
|
||||
struct call_path *parent;
|
||||
struct symbol *sym;
|
||||
u64 ip;
|
||||
u64 db_id;
|
||||
bool in_kernel;
|
||||
struct rb_node rb_node;
|
||||
struct rb_root children;
|
||||
};
|
||||
|
||||
int thread_stack__event(struct thread *thread, u32 flags, u64 from_ip,
|
||||
u64 to_ip, u16 insn_len, u64 trace_nr);
|
||||
void thread_stack__set_trace_nr(struct thread *thread, u64 trace_nr);
|
||||
void thread_stack__sample(struct thread *thread, struct ip_callchain *chain,
|
||||
size_t sz, u64 ip);
|
||||
void thread_stack__free(struct thread *thread);
|
||||
|
||||
struct call_return_processor *
|
||||
call_return_processor__new(int (*process)(struct call_return *cr, void *data),
|
||||
void *data);
|
||||
void call_return_processor__free(struct call_return_processor *crp);
|
||||
int thread_stack__process(struct thread *thread, struct comm *comm,
|
||||
struct perf_sample *sample,
|
||||
struct addr_location *from_al,
|
||||
struct addr_location *to_al, u64 ref,
|
||||
struct call_return_processor *crp);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue