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.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 16ed3c1e
...@@ -1637,6 +1637,13 @@ int symbol__strerror_disassemble(struct symbol *sym __maybe_unused, struct map * ...@@ -1637,6 +1637,13 @@ int symbol__strerror_disassemble(struct symbol *sym __maybe_unused, struct map *
case SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_CPUID_PARSING: case SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_CPUID_PARSING:
scnprintf(buf, buflen, "Problems while parsing the CPUID in the arch specific initialization."); scnprintf(buf, buflen, "Problems while parsing the CPUID in the arch specific initialization.");
break; 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: default:
scnprintf(buf, buflen, "Internal error: Invalid %d error code\n", errnum); scnprintf(buf, buflen, "Internal error: Invalid %d error code\n", errnum);
break; break;
...@@ -1719,13 +1726,13 @@ static int symbol__disassemble_bpf(struct symbol *sym, ...@@ -1719,13 +1726,13 @@ static int symbol__disassemble_bpf(struct symbol *sym,
char tpath[PATH_MAX]; char tpath[PATH_MAX];
size_t buf_size; size_t buf_size;
int nr_skip = 0; int nr_skip = 0;
int ret = -1;
char *buf; char *buf;
bfd *bfdf; bfd *bfdf;
int ret;
FILE *s; FILE *s;
if (dso->binary_type != DSO_BINARY_TYPE__BPF_PROG_INFO) 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__, pr_debug("%s: handling sym %s addr %" PRIx64 " len %" PRIx64 "\n", __func__,
sym->name, sym->start, sym->end - sym->start); sym->name, sym->start, sym->end - sym->start);
...@@ -1738,8 +1745,10 @@ static int symbol__disassemble_bpf(struct symbol *sym, ...@@ -1738,8 +1745,10 @@ static int symbol__disassemble_bpf(struct symbol *sym,
assert(bfd_check_format(bfdf, bfd_object)); assert(bfd_check_format(bfdf, bfd_object));
s = open_memstream(&buf, &buf_size); s = open_memstream(&buf, &buf_size);
if (!s) if (!s) {
ret = errno;
goto out; goto out;
}
init_disassemble_info(&info, s, init_disassemble_info(&info, s,
(fprintf_ftype) fprintf); (fprintf_ftype) fprintf);
...@@ -1748,8 +1757,10 @@ static int symbol__disassemble_bpf(struct symbol *sym, ...@@ -1748,8 +1757,10 @@ static int symbol__disassemble_bpf(struct symbol *sym,
info_node = perf_env__find_bpf_prog_info(dso->bpf_prog.env, info_node = perf_env__find_bpf_prog_info(dso->bpf_prog.env,
dso->bpf_prog.id); dso->bpf_prog.id);
if (!info_node) if (!info_node) {
return SYMBOL_ANNOTATE_ERRNO__BPF_MISSING_BTF;
goto out; goto out;
}
info_linear = info_node->info_linear; info_linear = info_node->info_linear;
sub_id = dso->bpf_prog.sub_id; sub_id = dso->bpf_prog.sub_id;
......
...@@ -372,6 +372,8 @@ enum symbol_disassemble_errno { ...@@ -372,6 +372,8 @@ enum symbol_disassemble_errno {
SYMBOL_ANNOTATE_ERRNO__NO_LIBOPCODES_FOR_BPF, SYMBOL_ANNOTATE_ERRNO__NO_LIBOPCODES_FOR_BPF,
SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_CPUID_PARSING, SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_CPUID_PARSING,
SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_REGEXP, SYMBOL_ANNOTATE_ERRNO__ARCH_INIT_REGEXP,
SYMBOL_ANNOTATE_ERRNO__BPF_INVALID_FILE,
SYMBOL_ANNOTATE_ERRNO__BPF_MISSING_BTF,
__SYMBOL_ANNOTATE_ERRNO__END, __SYMBOL_ANNOTATE_ERRNO__END,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment