perf annotate: Work with vmlinux outside symfs

Message ID 20221125114210.2353820-1-vincent.whitchurch@axis.com
State New
Headers
Series perf annotate: Work with vmlinux outside symfs |

Commit Message

Vincent Whitchurch Nov. 25, 2022, 11:42 a.m. UTC
  It is currently possible to use --symfs along with a vmlinux which lies
outside of the symfs by passing an absolute path to --vmlinux, thanks to
the check in dso__load_vmlinux() which handles this explicitly.

However, the annotate code lacks this check and thus perf annotate does
not work ("Internal error: Invalid -1 error code") for kernel functions
with this combination.  Add the missing handling.

Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
---
 tools/perf/util/annotate.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
  

Comments

Vincent Whitchurch June 16, 2023, 10:21 a.m. UTC | #1
On Fri, 2022-11-25 at 12:42 +0100, Vincent Whitchurch wrote:
> It is currently possible to use --symfs along with a vmlinux which lies
> outside of the symfs by passing an absolute path to --vmlinux, thanks to
> the check in dso__load_vmlinux() which handles this explicitly.
> 
> However, the annotate code lacks this check and thus perf annotate does
> not work ("Internal error: Invalid -1 error code") for kernel functions
> with this combination.  Add the missing handling.
> 
> Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>

This patch was not merged and I did not receive any comments on it
either.  Should I resend it?  It still applies cleanly to current
mainline.  Thanks.
  
Arnaldo Carvalho de Melo June 16, 2023, 1:05 p.m. UTC | #2
Em Fri, Jun 16, 2023 at 10:21:52AM +0000, Vincent Whitchurch escreveu:
> On Fri, 2022-11-25 at 12:42 +0100, Vincent Whitchurch wrote:
> > It is currently possible to use --symfs along with a vmlinux which lies
> > outside of the symfs by passing an absolute path to --vmlinux, thanks to
> > the check in dso__load_vmlinux() which handles this explicitly.
> > 
> > However, the annotate code lacks this check and thus perf annotate does
> > not work ("Internal error: Invalid -1 error code") for kernel functions
> > with this combination.  Add the missing handling.
> > 
> > Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
> 
> This patch was not merged and I did not receive any comments on it
> either.  Should I resend it?  It still applies cleanly to current
> mainline.  Thanks.

Thanks for the ping, I checked  dso__load_vmlinux() and it has:

        if (vmlinux[0] == '/')
                snprintf(symfs_vmlinux, sizeof(symfs_vmlinux), "%s", vmlinux);
        else
                symbol__join_symfs(symfs_vmlinux, vmlinux)

Exactly as you pointed out, applied.

- Arnaldo
  

Patch

diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index db475e44f42f..52bdec764545 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -1695,7 +1695,11 @@  static int dso__disassemble_filename(struct dso *dso, char *filename, size_t fil
 		 * cache, or is just a kallsyms file, well, lets hope that this
 		 * DSO is the same as when 'perf record' ran.
 		 */
-		__symbol__join_symfs(filename, filename_size, dso->long_name);
+		if (dso->kernel && dso->long_name[0] == '/')
+			snprintf(filename, filename_size,
+				 "%s", dso->long_name);
+		else
+			__symbol__join_symfs(filename, filename_size, dso->long_name);
 
 		mutex_lock(&dso->lock);
 		if (access(filename, R_OK) && errno == ENOENT && dso->nsinfo) {