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 <linux@armlinux.org.uk> Cc: Song Liu <songliubraving@fb.com> Cc: Alexei Starovoitov <ast@kernel.org> Cc: Daniel Borkmann <daniel@iogearbox.net> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org>, Cc: Will Deacon <will@kernel.org> Link: https://lkml.kernel.org/n/tip-usevw9r2gcipfcrbpaueurw0@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
16ed3c1e91
commit
11aad897f6
|
@ -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;
|
||||
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue
Block a user