Dwarves Archive mirror
 help / color / mirror / Atom feed
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


             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).