perf callchain: Compare dsos (as well) for CCKEY_FUNCTION
Two functions from different binaries can have same start address. Thus, comparing only start address in match_chain() leads to inconsistent callchains. Fix this by adding a check for dsos as well. Ex, https://www.spinics.net/lists/linux-perf-users/msg04067.html Reported-by: Alexander Pozdneev <pozdneyev@gmail.com> Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Krister Johansen <kjlx@templeofstupid.com> Cc: Milian Wolff <milian.wolff@kdab.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Yao Jin <yao.jin@linux.intel.com> Cc: zhangmengting@huawei.com Link: http://lkml.kernel.org/r/20171005091234.5874-1-ravi.bangoria@linux.vnet.ibm.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
1addcd55bc
commit
c1fbc0cf81
|
@ -685,6 +685,8 @@ static enum match_result match_chain(struct callchain_cursor_node *node,
|
|||
{
|
||||
struct symbol *sym = node->sym;
|
||||
u64 left, right;
|
||||
struct dso *left_dso = NULL;
|
||||
struct dso *right_dso = NULL;
|
||||
|
||||
if (callchain_param.key == CCKEY_SRCLINE) {
|
||||
enum match_result match = match_chain_srcline(node, cnode);
|
||||
|
@ -696,12 +698,14 @@ static enum match_result match_chain(struct callchain_cursor_node *node,
|
|||
if (cnode->ms.sym && sym && callchain_param.key == CCKEY_FUNCTION) {
|
||||
left = cnode->ms.sym->start;
|
||||
right = sym->start;
|
||||
left_dso = cnode->ms.map->dso;
|
||||
right_dso = node->map->dso;
|
||||
} else {
|
||||
left = cnode->ip;
|
||||
right = node->ip;
|
||||
}
|
||||
|
||||
if (left == right) {
|
||||
if (left == right && left_dso == right_dso) {
|
||||
if (node->branch) {
|
||||
cnode->branch_count++;
|
||||
|
||||
|
|
Loading…
Reference in New Issue