| From 48fcad7c9976326e4f192d0e1b84cec87387a997 Mon Sep 17 00:00:00 2001 |
| From: Masami Hiramatsu <mhiramat@kernel.org> |
| Date: Fri, 25 Oct 2019 17:46:52 +0900 |
| Subject: [PATCH] perf probe: Fix to list probe event with correct line number |
| |
| commit 3895534dd78f0fd4d3f9e05ee52b9cdd444a743e upstream. |
| |
| Since debuginfo__find_probe_point() uses dwarf_entrypc() for finding the |
| entry address of the function on which a probe is, it will fail when the |
| function DIE has only ranges attribute. |
| |
| To fix this issue, use die_entrypc() instead of dwarf_entrypc(). |
| |
| Without this fix, perf probe -l shows incorrect offset: |
| |
| # perf probe -l |
| probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask+18446744071579263632@work/linux/linux/kernel/cpu.c) |
| probe:clear_tasks_mm_cpumask_1 (on clear_tasks_mm_cpumask+18446744071579263752@work/linux/linux/kernel/cpu.c) |
| |
| With this: |
| |
| # perf probe -l |
| probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask@work/linux/linux/kernel/cpu.c) |
| probe:clear_tasks_mm_cpumask_1 (on clear_tasks_mm_cpumask:21@work/linux/linux/kernel/cpu.c) |
| |
| Committer testing: |
| |
| Before: |
| |
| [root@quaco ~]# perf probe -l |
| probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask+18446744071579765152@kernel/cpu.c) |
| [root@quaco ~]# |
| |
| After: |
| |
| [root@quaco ~]# perf probe -l |
| probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask@kernel/cpu.c) |
| [root@quaco ~]# |
| |
| Fixes: 1d46ea2a6a40 ("perf probe: Fix listing incorrect line number with inline function") |
| Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> |
| Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Cc: Jiri Olsa <jolsa@redhat.com> |
| Cc: Namhyung Kim <namhyung@kernel.org> |
| Link: http://lore.kernel.org/lkml/157199321227.8075.14655572419136993015.stgit@devnote2 |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c |
| index 6b40cc691a2d..930241bddbb3 100644 |
| --- a/tools/perf/util/probe-finder.c |
| +++ b/tools/perf/util/probe-finder.c |
| @@ -1553,7 +1553,7 @@ int debuginfo__find_probe_point(struct debuginfo *dbg, unsigned long addr, |
| /* Get function entry information */ |
| func = basefunc = dwarf_diename(&spdie); |
| if (!func || |
| - dwarf_entrypc(&spdie, &baseaddr) != 0 || |
| + die_entrypc(&spdie, &baseaddr) != 0 || |
| dwarf_decl_line(&spdie, &baseline) != 0) { |
| lineno = 0; |
| goto post; |
| @@ -1570,7 +1570,7 @@ int debuginfo__find_probe_point(struct debuginfo *dbg, unsigned long addr, |
| while (die_find_top_inlinefunc(&spdie, (Dwarf_Addr)addr, |
| &indie)) { |
| /* There is an inline function */ |
| - if (dwarf_entrypc(&indie, &_addr) == 0 && |
| + if (die_entrypc(&indie, &_addr) == 0 && |
| _addr == addr) { |
| /* |
| * addr is at an inline function entry. |
| -- |
| 2.7.4 |
| |