Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 156619
b: refs/heads/master
c: 1953287
h: refs/heads/master
i:
  156617: b454fdc
  156615: 8537c7a
v: v3
  • Loading branch information
Frederic Weisbecker authored and Ingo Molnar committed Aug 9, 2009
1 parent 55d8531 commit d6f8885
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 15 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 836179834833272f89098c6d1e1b89e8e69797c2
refs/heads/master: 1953287bfe8afcbbd235bd6c42c9df06d52438dc
4 changes: 2 additions & 2 deletions trunk/tools/perf/builtin-report.c
Original file line number Diff line number Diff line change
Expand Up @@ -901,7 +901,7 @@ callchain__fprintf_graph(FILE *fp, struct callchain_node *self,
int i;

if (callchain_param.mode == CHAIN_GRAPH_REL)
new_total = self->cumul_hit;
new_total = self->children_hit;
else
new_total = total_samples;

Expand Down Expand Up @@ -930,7 +930,7 @@ callchain__fprintf_graph(FILE *fp, struct callchain_node *self,
ret += ipchain__fprintf_graph(fp, chain, depth,
new_depth_mask, i++,
new_total,
child->cumul_hit);
cumul_hits(child));
}
ret += callchain__fprintf_graph(fp, child, new_total,
depth + 1,
Expand Down
27 changes: 16 additions & 11 deletions trunk/tools/perf/util/callchain.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,14 @@ rb_insert_callchain(struct rb_root *root, struct callchain_node *chain,
struct rb_node **p = &root->rb_node;
struct rb_node *parent = NULL;
struct callchain_node *rnode;
u64 chain_cumul = cumul_hits(chain);

while (*p) {
u64 rnode_cumul;

parent = *p;
rnode = rb_entry(parent, struct callchain_node, rb_node);
rnode_cumul = cumul_hits(rnode);

switch (mode) {
case CHAIN_FLAT:
Expand All @@ -40,7 +44,7 @@ rb_insert_callchain(struct rb_root *root, struct callchain_node *chain,
break;
case CHAIN_GRAPH_ABS: /* Falldown */
case CHAIN_GRAPH_REL:
if (rnode->cumul_hit < chain->cumul_hit)
if (rnode_cumul < chain_cumul)
p = &(*p)->rb_left;
else
p = &(*p)->rb_right;
Expand Down Expand Up @@ -87,7 +91,7 @@ static void __sort_chain_graph_abs(struct callchain_node *node,

chain_for_each_child(child, node) {
__sort_chain_graph_abs(child, min_hit);
if (child->cumul_hit >= min_hit)
if (cumul_hits(child) >= min_hit)
rb_insert_callchain(&node->rb_root, child,
CHAIN_GRAPH_ABS);
}
Expand All @@ -108,11 +112,11 @@ static void __sort_chain_graph_rel(struct callchain_node *node,
u64 min_hit;

node->rb_root = RB_ROOT;
min_hit = node->cumul_hit * min_percent / 100.0;
min_hit = node->children_hit * min_percent / 100.0;

chain_for_each_child(child, node) {
__sort_chain_graph_rel(child, min_percent);
if (child->cumul_hit >= min_hit)
if (cumul_hits(child) >= min_hit)
rb_insert_callchain(&node->rb_root, child,
CHAIN_GRAPH_REL);
}
Expand Down Expand Up @@ -211,7 +215,8 @@ add_child(struct callchain_node *parent, struct ip_callchain *chain,
new = create_child(parent, false);
fill_node(new, chain, start, syms);

new->cumul_hit = new->hit = 1;
new->children_hit = 0;
new->hit = 1;
}

/*
Expand Down Expand Up @@ -241,14 +246,16 @@ split_add_child(struct callchain_node *parent, struct ip_callchain *chain,

/* split the hits */
new->hit = parent->hit;
new->cumul_hit = parent->cumul_hit;
new->children_hit = parent->children_hit;
parent->children_hit = cumul_hits(new);
new->val_nr = parent->val_nr - idx_local;
parent->val_nr = idx_local;

/* create a new child for the new branch if any */
if (idx_total < chain->nr) {
parent->hit = 0;
add_child(parent, chain, idx_total, syms);
parent->children_hit++;
} else {
parent->hit = 1;
}
Expand All @@ -269,13 +276,13 @@ __append_chain_children(struct callchain_node *root, struct ip_callchain *chain,
unsigned int ret = __append_chain(rnode, chain, start, syms);

if (!ret)
goto cumul;
goto inc_children_hit;
}
/* nothing in children, add to the current node */
add_child(root, chain, start, syms);

cumul:
root->cumul_hit++;
inc_children_hit:
root->children_hit++;
}

static int
Expand Down Expand Up @@ -317,8 +324,6 @@ __append_chain(struct callchain_node *root, struct ip_callchain *chain,
/* we match 100% of the path, increment the hit */
if (i - start == root->val_nr && i == chain->nr) {
root->hit++;
root->cumul_hit++;

return 0;
}

Expand Down
7 changes: 6 additions & 1 deletion trunk/tools/perf/util/callchain.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ struct callchain_node {
struct rb_root rb_root; /* sorted tree of children */
unsigned int val_nr;
u64 hit;
u64 cumul_hit; /* hit + hits of children */
u64 children_hit;
};

struct callchain_param;
Expand All @@ -48,6 +48,11 @@ static inline void callchain_init(struct callchain_node *node)
INIT_LIST_HEAD(&node->val);
}

static inline u64 cumul_hits(struct callchain_node *node)
{
return node->hit + node->children_hit;
}

int register_callchain_param(struct callchain_param *param);
void append_chain(struct callchain_node *root, struct ip_callchain *chain,
struct symbol **syms);
Expand Down

0 comments on commit d6f8885

Please sign in to comment.