On Mon, Oct 26, 2020 at 3:18 PM Hao Luo <haoluo@xxxxxxxxxx> wrote: > > 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@xxxxxxxxxx> > --- Looks good, thanks for the prompt fix! Acked-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > 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 >