perf annotate: Don't return -1 for error when doing BPF disassembly
A message that is not in the archive (sent off-list or not yet received): [email protected]
The following commit has been merged into the perf/urgent branch of tip:
Commit-ID: 11aad897f6d1a28eae3b7e5b293647c522d65819 Gitweb: https://git.kernel.org/tip/11aad897f6d1a28eae3b7e5b293647c522d65819 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Mon, 30 Sep 2019 16:04:21 -03:00 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitterDate: Mon, 30 Sep 2019 17:30:06 -03:00
perf annotate: Don't return -1 for error when doing BPF disassembly
Return errno when open_memstream() fails and add two new speciall error codes for when an invalid, non BPF file or one without BTF is passed to symbol__disassemble_bpf(), so that its callers can rely on symbol__strerror_disassemble() to convert that to a human readable error message that can help figure out what is wrong, with hints even.
Cc Russell King - ARM Linux admin <[email protected]>
Cc Song Liu <[email protected]>
Cc Alexei Starovoitov <[email protected]>
Cc Daniel Borkmann <[email protected]>
Cc Adrian Hunter <[email protected]>
Cc Alexander Shishkin <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Peter Zijlstra <[email protected]>,
Cc Will Deacon <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/annotate.c | 19 +++++++++++++++---- tools/perf/util/annotate.h | 2 ++ 2 files changed, 17 insertions(+), 4 deletions(-)
tools/perf/util/annotate.c +15 -4
@@ -1637,6 +1637,13 @@ int symbol__strerror_disassemble(struct symbol *sym __maybe_unused, struct map *case SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_CPUID_PARSING :scnprintf (buf, buflen,"Problems while parsing the CPUID in the arch specific initialization." );break ; +case SYMBOL_ANNOTATE_ERRNO__BPF_INVALID_FILE : +scnprintf (buf, buflen,"Invalid BPF file: %s." , dso->long_name); +break ; +case SYMBOL_ANNOTATE_ERRNO__BPF_MISSING_BTF : +scnprintf (buf, buflen,"The %s BPF file has no BTF section, compile with -g or use pahole -J." , + dso->long_name); +break ;default :scnprintf (buf, buflen,"Internal error: Invalid %d error code\n" , errnum);break ;
@@ -1719,13 +1726,13 @@ static int symbol__disassemble_bpf(struct symbol *sym,char tpath[PATH_MAX ];size_t buf_size;int nr_skip =0 ; -int ret =-1 ;char *buf;bfd *bfdf; +int ret;FILE *s;if (dso->binary_type !=DSO_BINARY_TYPE__BPF_PROG_INFO ) -return -1 ; +return SYMBOL_ANNOTATE_ERRNO__BPF_INVALID_FILE ;pr_debug ("%s: handling sym %s addr %" PRIx64" len %" PRIx64"\n" , __func__, sym->name, sym->start, sym->end - sym->start);
@@ -1738,8 +1745,10 @@ static int symbol__disassemble_bpf(struct symbol *sym,assert (bfd_check_format (bfdf, bfd_object)); s =open_memstream (&buf, &buf_size); -if (!s) +if (!s) { + ret = errno; goto out; + }init_disassemble_info (&info, s, (fprintf_ftype ) fprintf);
@@ -1748,8 +1757,10 @@ static int symbol__disassemble_bpf(struct symbol *sym, info_node =perf_env__find_bpf_prog_info (dso->bpf_prog.env, dso->bpf_prog.id); -if (!info_node) +if (!info_node) { +return SYMBOL_ANNOTATE_ERRNO__BPF_MISSING_BTF ; goto out; + } info_linear = info_node->info_linear; sub_id = dso->bpf_prog.sub_id;
tools/perf/util/annotate.h +2 -0
@@ -372,6 +372,8 @@ enum symbol_disassemble_errno {SYMBOL_ANNOTATE_ERRNO__NO_LIBOPCODES_FOR_BPF ,SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_CPUID_PARSING ,SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_REGEXP , +SYMBOL_ANNOTATE_ERRNO__BPF_INVALID_FILE , +SYMBOL_ANNOTATE_ERRNO__BPF_MISSING_BTF , __SYMBOL_ANNOTATE_ERRNO__END, };