diff options
author | Ingo Molnar <mingo@kernel.org> | 2017-10-05 20:07:08 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2017-10-05 20:07:08 +0200 |
commit | 874d48f2af91efc38c720e7c6450547f6ea8c843 (patch) | |
tree | f945d083595f20cada9273ecdc58357b899587dd /tools | |
parent | 77ede3a014a32746002f7889211f0cecf4803163 (diff) | |
parent | c1fbc0cf81f1c464f5fda322c1104d4bb1da6711 (diff) | |
download | linux-stable-874d48f2af91efc38c720e7c6450547f6ea8c843.tar.gz linux-stable-874d48f2af91efc38c720e7c6450547f6ea8c843.tar.bz2 linux-stable-874d48f2af91efc38c720e7c6450547f6ea8c843.zip |
Merge tag 'perf-urgent-for-mingo-4.14-20171005' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent
Pull perf/urgent fix from Arnaldo Carvalho de Melo:
- Two functions from different binaries can have the same start address. Thus,
comparing only the start address in match_chain() leads to inconsistent
callchains. Fix this by adding a check for DSOs as well (Ravi Bangoria)
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/util/callchain.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c index be09d77cade0..a971caf3759d 100644 --- a/tools/perf/util/callchain.c +++ b/tools/perf/util/callchain.c @@ -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++; |