Dwarves debugging tools
 help / color / mirror / Atom feed
* [PATCH] btf_encoder: Check var type after checking var addr.
@ 2020-10-26 22:18 Hao Luo
  2020-10-26 23:22 ` Andrii Nakryiko
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Hao Luo @ 2020-10-26 22:18 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Andrii Nakryiko, Jiri Olsa, dwarves, Hao Luo

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


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-10-27 11:20 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-10-26 22:18 [PATCH] btf_encoder: Check var type after checking var addr Hao Luo
2020-10-26 23:22 ` Andrii Nakryiko
2020-10-27 11:19 ` Arnaldo Carvalho de Melo
2020-10-27 11:20 ` Jiri Olsa

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox