Hi Kartikeya, Kumar Kartikeya Dwivedi <memxor@xxxxxxxxx> writes: > On Thu, Nov 11, 2021 at 05:21:53AM IST, Vinicius Costa Gomes wrote: >> Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx> writes: >> >> >> Thanks for the fix. >> >> >> >> But instead of moving this to core.c, you can probably make the btf.h >> >> declaration conditional on CONFIG_BPF_SYSCALL, since this is not useful in >> >> isolation (only used by verifier for module kfunc support). For the case of >> >> kfunc_btf_id_list variables, just define it as an empty struct and static >> >> variables, since the definition is still inside btf.c. So it becomes a noop for >> >> !CONFIG_BPF_SYSCALL. >> >> >> >> I am also not sure whether BTF is useful without BPF support, but maybe I'm >> >> missing some usecase. >> > >> > Unlikely. I would just disallow such config instead of sprinkling >> > the code with ifdefs. >> >> Is something like this what you have in mind? >> >> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug >> index 6fdbf9613aec..eae860c86e26 100644 >> --- a/lib/Kconfig.debug >> +++ b/lib/Kconfig.debug >> @@ -316,6 +316,7 @@ config DEBUG_INFO_BTF >> bool "Generate BTF typeinfo" >> depends on !DEBUG_INFO_SPLIT && !DEBUG_INFO_REDUCED >> depends on !GCC_PLUGIN_RANDSTRUCT || COMPILE_TEST >> + depends on BPF_SYSCALL >> help >> Generate deduplicated BTF type information from DWARF debug info. >> Turning this on expects presence of pahole tool, which will convert >> >> > > BTW, you will need a little more than that, I suspect the compiler optimizes out > the register/unregister call so we don't see a build failure, but adding a side > effect gives me errors, so something like this should resolve the problem (since > kfunc_btf_id_list variable definition is behind CONFIG_BPF_SYSCALL). > > diff --git a/include/linux/btf.h b/include/linux/btf.h > index 203eef993d76..e9881ef9e9aa 100644 > --- a/include/linux/btf.h > +++ b/include/linux/btf.h > @@ -254,6 +254,8 @@ void unregister_kfunc_btf_id_set(struct kfunc_btf_id_list *l, > struct kfunc_btf_id_set *s); > bool bpf_check_mod_kfunc_call(struct kfunc_btf_id_list *klist, u32 kfunc_id, > struct module *owner); > +extern struct kfunc_btf_id_list bpf_tcp_ca_kfunc_list; > +extern struct kfunc_btf_id_list prog_test_kfunc_list; > #else > static inline void register_kfunc_btf_id_set(struct kfunc_btf_id_list *l, > struct kfunc_btf_id_set *s) > @@ -268,13 +270,13 @@ static inline bool bpf_check_mod_kfunc_call(struct kfunc_btf_id_list *klist, > { > return false; > } > +struct kfunc_btf_id_list {}; > +static struct kfunc_btf_id_list bpf_tcp_ca_kfunc_list __maybe_unused; > +static struct kfunc_btf_id_list prog_test_kfunc_list __maybe_unused; > + > #endif > > #define DEFINE_KFUNC_BTF_ID_SET(set, name) \ > struct kfunc_btf_id_set name = { LIST_HEAD_INIT(name.list), (set), \ > THIS_MODULE } > - > -extern struct kfunc_btf_id_list bpf_tcp_ca_kfunc_list; > -extern struct kfunc_btf_id_list prog_test_kfunc_list; > - > #endif > I could not reproduce the build failure here even when adding some side effects, but I didn't try very hard. As you are more familiar with the code, I would be glad if you could take it from here and propose a patch. Cheers, -- Vinicius