Messages in this thread Patch in this message |  | | | Date | Mon, 25 May 2009 16:46:09 +0800 | | From | Li Zefan <> | | Subject | [PATCH 1/3] tracing/stat: sort in ascending order |
| |
Currently the output of trace_stat/workqueues is totally reversed:
# cat /debug/tracing/trace_stat/workqueues ... 1 17 17 210 37 `-blk_unplug_work+0x0/0x57 1 3779 3779 181 11 |-cfq_kick_queue+0x0/0x2f 1 3796 3796 kblockd/1:120 ... The correct output should be:
1 3796 3796 kblockd/1:120 1 3779 3779 181 11 |-cfq_kick_queue+0x0/0x2f 1 17 17 210 37 `-blk_unplug_work+0x0/0x57 It's caused by "tracing/stat: replace linked list by an rbtree for sorting" (53059c9b67a62a3dc8c80204d3da42b9267ea5a0).
Though we can simply change dummy_cmp() to return -1 instead of 1, IMO it's better to always do ascending sorting in trace_stat.c, and leave each stat tracer to decide whether to sort in descending or ascending order.
[ Impact: fix the output of trace_stat/workqueue ]
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> --- kernel/trace/ftrace.c | 12 ++++++------ kernel/trace/trace_branch.c | 5 +++-- kernel/trace/trace_stat.c | 6 +----- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 140699a..3dd16bd 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -315,29 +315,29 @@ static void *function_stat_start(struct tracer_stat *trace) } #ifdef CONFIG_FUNCTION_GRAPH_TRACER -/* function graph compares on total time */ +/* function graph compares on total time in reverse order */ static int function_stat_cmp(void *p1, void *p2) { struct ftrace_profile *a = p1; struct ftrace_profile *b = p2; - if (a->time < b->time) - return -1; if (a->time > b->time) + return -1; + if (a->time < b->time) return 1; else return 0; } #else -/* not function graph compares against hits */ +/* not function graph compares against hits in reverse order */ static int function_stat_cmp(void *p1, void *p2) { struct ftrace_profile *a = p1; struct ftrace_profile *b = p2; - if (a->counter < b->counter) - return -1; if (a->counter > b->counter) + return -1; + if (a->counter < b->counter) return 1; else return 0; diff --git a/kernel/trace/trace_branch.c b/kernel/trace/trace_branch.c index 7a7a9fd..df58411 100644 --- a/kernel/trace/trace_branch.c +++ b/kernel/trace/trace_branch.c @@ -301,9 +301,10 @@ static int annotated_branch_stat_cmp(void *p1, void *p2) percent_a = get_incorrect_percent(a); percent_b = get_incorrect_percent(b); - if (percent_a < percent_b) - return -1; + /* sort in descending order */ if (percent_a > percent_b) + return -1; + if (percent_a < percent_b) return 1; else return 0; diff --git a/kernel/trace/trace_stat.c b/kernel/trace/trace_stat.c index 2e849b5..6efbcb4 100644 --- a/kernel/trace/trace_stat.c +++ b/kernel/trace/trace_stat.c @@ -98,10 +98,6 @@ insert_stat(struct rb_root *root, struct stat_node *data, cmp_stat_t cmp) { struct rb_node **new = &(root->rb_node), *parent = NULL; - /* - * Figure out where to put new node - * This is a descendent sorting - */ while (*new) { struct stat_node *this; int result; @@ -110,7 +106,7 @@ insert_stat(struct rb_root *root, struct stat_node *data, cmp_stat_t cmp) result = cmp(data->stat, this->stat); parent = *new; - if (result >= 0) + if (result < 0) new = &((*new)->rb_left); else new = &((*new)->rb_right); -- 1.5.4.rc3
|  |