lkml.org 
[lkml]   [2009]   [Aug]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perfcounters/urgent] perf tools: callchain: Fix bad rounding of minimum rate
    Commit-ID:  c0a8865e32c8d1a562db38e06ef31ef23282f646
    Gitweb: http://git.kernel.org/tip/c0a8865e32c8d1a562db38e06ef31ef23282f646
    Author: Frederic Weisbecker <fweisbec@gmail.com>
    AuthorDate: Sun, 9 Aug 2009 04:19:15 +0200
    Committer: Ingo Molnar <mingo@elte.hu>
    CommitDate: Sun, 9 Aug 2009 13:07:46 +0200

    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>


    ---
    tools/perf/util/callchain.c | 5 +++--
    1 files changed, 3 insertions(+), 2 deletions(-)

    diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
    index a8e67aa..0114734 100644
    --- a/tools/perf/util/callchain.c
    +++ b/tools/perf/util/callchain.c
    @@ -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;
    }


    \
     
     \ /
      Last update: 2009-08-09 13:15    [W:0.030 / U:2.568 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site