diff options
Diffstat (limited to 'tools/perf/util/thread-stack.c')
| -rw-r--r-- | tools/perf/util/thread-stack.c | 139 | 
1 files changed, 1 insertions, 138 deletions
diff --git a/tools/perf/util/thread-stack.c b/tools/perf/util/thread-stack.c index 679688e70ae7..825086aa9a08 100644 --- a/tools/perf/util/thread-stack.c +++ b/tools/perf/util/thread-stack.c @@ -22,44 +22,9 @@  #include "debug.h"  #include "symbol.h"  #include "comm.h" +#include "call-path.h"  #include "thread-stack.h" -#define CALL_PATH_BLOCK_SHIFT 8 -#define CALL_PATH_BLOCK_SIZE (1 << CALL_PATH_BLOCK_SHIFT) -#define CALL_PATH_BLOCK_MASK (CALL_PATH_BLOCK_SIZE - 1) - -struct call_path_block { -	struct call_path cp[CALL_PATH_BLOCK_SIZE]; -	struct list_head node; -}; - -/** - * struct call_path_root - root of all call paths. - * @call_path: root call path - * @blocks: list of blocks to store call paths - * @next: next free space - * @sz: number of spaces - */ -struct call_path_root { -	struct call_path call_path; -	struct list_head blocks; -	size_t next; -	size_t sz; -}; - -/** - * struct call_return_processor - provides a call-back to consume call-return - *                                information. - * @cpr: call path root - * @process: call-back that accepts call/return information - * @data: anonymous data for call-back - */ -struct call_return_processor { -	struct call_path_root *cpr; -	int (*process)(struct call_return *cr, void *data); -	void *data; -}; -  #define STACK_GROWTH 2048  /** @@ -335,108 +300,6 @@ void thread_stack__sample(struct thread *thread, struct ip_callchain *chain,  		chain->ips[i] = thread->ts->stack[thread->ts->cnt - i].ret_addr;  } -static void call_path__init(struct call_path *cp, struct call_path *parent, -			    struct symbol *sym, u64 ip, bool in_kernel) -{ -	cp->parent = parent; -	cp->sym = sym; -	cp->ip = sym ? 0 : ip; -	cp->db_id = 0; -	cp->in_kernel = in_kernel; -	RB_CLEAR_NODE(&cp->rb_node); -	cp->children = RB_ROOT; -} - -static struct call_path_root *call_path_root__new(void) -{ -	struct call_path_root *cpr; - -	cpr = zalloc(sizeof(struct call_path_root)); -	if (!cpr) -		return NULL; -	call_path__init(&cpr->call_path, NULL, NULL, 0, false); -	INIT_LIST_HEAD(&cpr->blocks); -	return cpr; -} - -static void call_path_root__free(struct call_path_root *cpr) -{ -	struct call_path_block *pos, *n; - -	list_for_each_entry_safe(pos, n, &cpr->blocks, node) { -		list_del(&pos->node); -		free(pos); -	} -	free(cpr); -} - -static struct call_path *call_path__new(struct call_path_root *cpr, -					struct call_path *parent, -					struct symbol *sym, u64 ip, -					bool in_kernel) -{ -	struct call_path_block *cpb; -	struct call_path *cp; -	size_t n; - -	if (cpr->next < cpr->sz) { -		cpb = list_last_entry(&cpr->blocks, struct call_path_block, -				      node); -	} else { -		cpb = zalloc(sizeof(struct call_path_block)); -		if (!cpb) -			return NULL; -		list_add_tail(&cpb->node, &cpr->blocks); -		cpr->sz += CALL_PATH_BLOCK_SIZE; -	} - -	n = cpr->next++ & CALL_PATH_BLOCK_MASK; -	cp = &cpb->cp[n]; - -	call_path__init(cp, parent, sym, ip, in_kernel); - -	return cp; -} - -static struct call_path *call_path__findnew(struct call_path_root *cpr, -					    struct call_path *parent, -					    struct symbol *sym, u64 ip, u64 ks) -{ -	struct rb_node **p; -	struct rb_node *node_parent = NULL; -	struct call_path *cp; -	bool in_kernel = ip >= ks; - -	if (sym) -		ip = 0; - -	if (!parent) -		return call_path__new(cpr, parent, sym, ip, in_kernel); - -	p = &parent->children.rb_node; -	while (*p != NULL) { -		node_parent = *p; -		cp = rb_entry(node_parent, struct call_path, rb_node); - -		if (cp->sym == sym && cp->ip == ip) -			return cp; - -		if (sym < cp->sym || (sym == cp->sym && ip < cp->ip)) -			p = &(*p)->rb_left; -		else -			p = &(*p)->rb_right; -	} - -	cp = call_path__new(cpr, parent, sym, ip, in_kernel); -	if (!cp) -		return NULL; - -	rb_link_node(&cp->rb_node, node_parent, p); -	rb_insert_color(&cp->rb_node, &parent->children); - -	return cp; -} -  struct call_return_processor *  call_return_processor__new(int (*process)(struct call_return *cr, void *data),  			   void *data)  | 
