forked from Minki/linux
perf tools: callchain: Fix bad rounding of minimum rate
Sometimes we get callchain branches that have a rate under the limit given by the user. Say you launched: perf record -f -g -a ./hackbench 10 perf report -g fractal,10.0 And you got: 2.33% hackbench [kernel] [k] _spin_lock_irqsave | |--78.57%-- remove_wait_queue | poll_freewait | do_sys_poll | sys_poll | sysenter_dispatch | 0xf7ffa430 | 0x1ffadea3c | |--7.14%-- __up_read | up_read | do_page_fault | page_fault | 0xf7ffa430 | 0xa0df710000000a ... It is abnormal to get a 7.14% branch whereas we passed a 10% filter. The problem is that we round down the minimum threshold. This happens mostly when we have very low number of events. If the total amount of your branch is 4 and you have a subranch of 3 events, filtering to 90% will be computed like follows: limit = 4 * 0.9; The result is about 3.6, but the cast to integer will round down to 3. It means that our filter is actually of 75% We must then explicitly round up the minimum threshold. Reported-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: acme@redhat.com Cc: peterz@infradead.org Cc: efault@gmx.de LKML-Reference: <20090809024235.GA10146@nowhere> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
183f3b0887
commit
c0a8865e32
@ -13,6 +13,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "callchain.h"
|
||||
|
||||
@ -112,7 +113,7 @@ static void __sort_chain_graph_rel(struct callchain_node *node,
|
||||
u64 min_hit;
|
||||
|
||||
node->rb_root = RB_ROOT;
|
||||
min_hit = node->children_hit * min_percent / 100.0;
|
||||
min_hit = ceil(node->children_hit * min_percent);
|
||||
|
||||
chain_for_each_child(child, node) {
|
||||
__sort_chain_graph_rel(child, min_percent);
|
||||
@ -126,7 +127,7 @@ static void
|
||||
sort_chain_graph_rel(struct rb_root *rb_root, struct callchain_node *chain_root,
|
||||
u64 min_hit __used, struct callchain_param *param)
|
||||
{
|
||||
__sort_chain_graph_rel(chain_root, param->min_percent);
|
||||
__sort_chain_graph_rel(chain_root, param->min_percent / 100.0);
|
||||
rb_root->rb_node = chain_root->rb_root.rb_node;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user