Re: [PATCH net v2] bpf: Fix build when CONFIG_BPF_SYSCALL is disabled
From: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Date: 2021-11-11 02:11:39
Also in:
bpf
On Thu, Nov 11, 2021 at 07:34:38AM IST, Vinicius Costa Gomes wrote:
Hi Kartikeya, Kumar Kartikeya Dwivedi [off-list ref] writes:quoted
On Thu, Nov 11, 2021 at 05:21:53AM IST, Vinicius Costa Gomes wrote:quoted
Alexei Starovoitov [off-list ref] writes:quoted
quoted
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 convertBTW, 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; - #endifI 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.
Sure, no worries!
Cheers, -- Vinicius
-- Kartikeya