From: Hao Luo <haoluo@google.com>
To: Arnaldo Carvalho de Melo <arnaldo.melo@gmail.com>
Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com>,
Jiri Olsa <jolsa@kernel.org>,
dwarves@vger.kernel.org, Hao Luo <haoluo@google.com>
Subject: [PATCH] btf_encoder: Check var type after checking var addr.
Date: Mon, 26 Oct 2020 15:18:22 -0700 [thread overview]
Message-ID: <20201026221822.29021-1-haoluo@google.com> (raw)
Commit 2e719cc ("btf_encoder: revamp how per-CPU variables are
encoded") adds percpu_var_exists() to filter out the symbols that
are not percpu var. However, the check comes after checking the
var's type. There can be symbols that are of zero type. If we hit
that, btf_encoder will not work without '--btf_encode_force'.
So we should check percpu_var_exists before checking var's type.
Tested:
haoluo@haoluo:~/kernel/tip$ gcc --version
gcc (GCC) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Before:
haoluo@haoluo:~/kernel/tip$ make clean -s
haoluo@haoluo:~/kernel/tip$ make -j 32 -s
LINK resolve_btfids
error: found variable in CU 'kernel/bpf/btf.c' that has void type
Encountered error while encoding BTF.
FAILED: load BTF from vmlinux: Unknown error -2make: *** [Makefile:1164: vmlinux] Error 255
After:
haoluo@haoluo:~/kernel/tip$ make clean -s
haoluo@haoluo:~/kernel/tip$ make -j 32 -s
LINK resolve_btfids
haoluo@haoluo:~/kernel/tip$
Fixes: 2e719cc ("btf_encoder: revamp how per-CPU variables are encoded")
Signed-off-by: Hao Luo <haoluo@google.com>
---
btf_encoder.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/btf_encoder.c b/btf_encoder.c
index 2a6455b..b5f8f3e 100644
--- a/btf_encoder.c
+++ b/btf_encoder.c
@@ -441,9 +441,12 @@ int cu__encode_btf(struct cu *cu, int verbose, bool force,
if (var->spec)
var = var->spec;
+ if (!percpu_var_exists(addr, &size, &name))
+ continue; /* not a per-CPU variable */
+
if (var->ip.tag.type == 0) {
- fprintf(stderr, "error: found variable in CU '%s' that has void type\n",
- cu->name);
+ fprintf(stderr, "error: found variable '%s' in CU '%s' that has void type\n",
+ name, cu->name);
if (force)
continue;
err = -1;
@@ -452,8 +455,6 @@ int cu__encode_btf(struct cu *cu, int verbose, bool force,
type = var->ip.tag.type + type_id_off;
linkage = var->external ? BTF_VAR_GLOBAL_ALLOCATED : BTF_VAR_STATIC;
- if (!percpu_var_exists(addr, &size, &name))
- continue; /* not a per-CPU variable */
if (btf_elf__verbose) {
printf("Variable '%s' from CU '%s' at address 0x%lx encoded\n",
--
2.29.0.rc1.297.gfa9743e501-goog
next reply other threads:[~2020-10-26 22:18 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-26 22:18 Hao Luo [this message]
2020-10-26 23:22 ` [PATCH] btf_encoder: Check var type after checking var addr Andrii Nakryiko
2020-10-27 11:19 ` Arnaldo Carvalho de Melo
2020-10-27 11:20 ` Jiri Olsa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201026221822.29021-1-haoluo@google.com \
--to=haoluo@google.com \
--cc=andrii.nakryiko@gmail.com \
--cc=arnaldo.melo@gmail.com \
--cc=dwarves@vger.kernel.org \
--cc=jolsa@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).