Commit 3e152aa9 authored by Jin Yao's avatar Jin Yao Committed by Arnaldo Carvalho de Melo

perf block-info: Fix wrong block address comparison in block_info__cmp()

Commit 60414418 ("perf block: Cleanup and refactor block info
functions") introduces block_info__cmp(), which compares two blocks.

But the issues are:

1. It should return the strcmp cmp value only if it's not 0.

2. When symbol names are matched, we need to compare the addresses
   of blocks further. But it wrongly uses the symbol addresses for
   comparison.

3. If the syms are both NULL, we can't consider these two blocks are
   matched.

This patch fixes above 3 issues.

Fixes: 60414418 ("perf block: Cleanup and refactor block info functions")
Signed-off-by: default avatarJin Yao <yao.jin@linux.intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jin Yao <yao.jin@intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lore.kernel.org/lkml/20200202141655.32053-2-yao.jin@linux.intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent d942815a
...@@ -74,30 +74,21 @@ int64_t block_info__cmp(struct perf_hpp_fmt *fmt __maybe_unused, ...@@ -74,30 +74,21 @@ int64_t block_info__cmp(struct perf_hpp_fmt *fmt __maybe_unused,
if (!bi_l->sym || !bi_r->sym) { if (!bi_l->sym || !bi_r->sym) {
if (!bi_l->sym && !bi_r->sym) if (!bi_l->sym && !bi_r->sym)
return 0; return -1;
else if (!bi_l->sym) else if (!bi_l->sym)
return -1; return -1;
else else
return 1; return 1;
} }
if (bi_l->sym == bi_r->sym) { cmp = strcmp(bi_l->sym->name, bi_r->sym->name);
if (bi_l->start == bi_r->start) { if (cmp)
if (bi_l->end == bi_r->end)
return 0;
else
return (int64_t)(bi_r->end - bi_l->end);
} else
return (int64_t)(bi_r->start - bi_l->start);
} else {
cmp = strcmp(bi_l->sym->name, bi_r->sym->name);
return cmp; return cmp;
}
if (bi_l->sym->start != bi_r->sym->start) if (bi_l->start != bi_r->start)
return (int64_t)(bi_r->sym->start - bi_l->sym->start); return (int64_t)(bi_r->start - bi_l->start);
return (int64_t)(bi_r->sym->end - bi_l->sym->end); return (int64_t)(bi_r->end - bi_l->end);
} }
static void init_block_info(struct block_info *bi, struct symbol *sym, static void init_block_info(struct block_info *bi, struct symbol *sym,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment