When CONFIG_DEBUG_INFO_BTF is enabled and CONFIG_BPF_SYSCALL is disabled, the following compilation error can be seen: GEN .version CHK include/generated/compile.h UPD include/generated/compile.h CC init/version.o AR init/built-in.a LD vmlinux.o MODPOST vmlinux.symvers MODINFO modules.builtin.modinfo GEN modules.builtin LD .tmp_vmlinux.btf ld: net/ipv4/tcp_cubic.o: in function `cubictcp_unregister': net/ipv4/tcp_cubic.c:545: undefined reference to `bpf_tcp_ca_kfunc_list' ld: net/ipv4/tcp_cubic.c:545: undefined reference to `unregister_kfunc_btf_id_set' ld: net/ipv4/tcp_cubic.o: in function `cubictcp_register': net/ipv4/tcp_cubic.c:539: undefined reference to `bpf_tcp_ca_kfunc_list' ld: net/ipv4/tcp_cubic.c:539: undefined reference to `register_kfunc_btf_id_set' BTF .btf.vmlinux.bin.o pahole: .tmp_vmlinux.btf: No such file or directory LD .tmp_vmlinux.kallsyms1 .btf.vmlinux.bin.o: file not recognized: file format not recognized make: *** [Makefile:1187: vmlinux] Error 1 'bpf_tcp_ca_kfunc_list', 'register_kfunc_btf_id_set()' and 'unregister_kfunc_btf_id_set()' are only defined when CONFIG_BPF_SYSCALL is enabled. Fix that by moving those definitions somewhere that doesn't depend on the bpf() syscall. Fixes: 14f267d95fe4 ("bpf: btf: Introduce helpers for dynamic BTF set registration") Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@xxxxxxxxx> --- This is RFC-ish as I don't know enough about BPF/BTF. I could be missing something. kernel/bpf/btf.c | 25 ------------------------- kernel/bpf/core.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c index dbc3ad07e21b..69dd2efd518f 100644 --- a/kernel/bpf/btf.c +++ b/kernel/bpf/btf.c @@ -6344,33 +6344,8 @@ const struct bpf_func_proto bpf_btf_find_by_name_kind_proto = { BTF_ID_LIST_GLOBAL_SINGLE(btf_task_struct_ids, struct, task_struct) -/* BTF ID set registration API for modules */ - -struct kfunc_btf_id_list { - struct list_head list; - struct mutex mutex; -}; - #ifdef CONFIG_DEBUG_INFO_BTF_MODULES -void register_kfunc_btf_id_set(struct kfunc_btf_id_list *l, - struct kfunc_btf_id_set *s) -{ - mutex_lock(&l->mutex); - list_add(&s->list, &l->list); - mutex_unlock(&l->mutex); -} -EXPORT_SYMBOL_GPL(register_kfunc_btf_id_set); - -void unregister_kfunc_btf_id_set(struct kfunc_btf_id_list *l, - struct kfunc_btf_id_set *s) -{ - mutex_lock(&l->mutex); - list_del_init(&s->list); - mutex_unlock(&l->mutex); -} -EXPORT_SYMBOL_GPL(unregister_kfunc_btf_id_set); - bool bpf_check_mod_kfunc_call(struct kfunc_btf_id_list *klist, u32 kfunc_id, struct module *owner) { diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index 327e3996eadb..4b2ad0fa0a4f 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -2449,6 +2449,43 @@ int __weak bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t, DEFINE_STATIC_KEY_FALSE(bpf_stats_enabled_key); EXPORT_SYMBOL(bpf_stats_enabled_key); +/* BTF ID set registration API for modules */ + +struct kfunc_btf_id_list { + struct list_head list; + struct mutex mutex; +}; + +#ifdef CONFIG_DEBUG_INFO_BTF_MODULES + +void register_kfunc_btf_id_set(struct kfunc_btf_id_list *l, + struct kfunc_btf_id_set *s) +{ + mutex_lock(&l->mutex); + list_add(&s->list, &l->list); + mutex_unlock(&l->mutex); +} +EXPORT_SYMBOL_GPL(register_kfunc_btf_id_set); + +void unregister_kfunc_btf_id_set(struct kfunc_btf_id_list *l, + struct kfunc_btf_id_set *s) +{ + mutex_lock(&l->mutex); + list_del_init(&s->list); + mutex_unlock(&l->mutex); +} +EXPORT_SYMBOL_GPL(unregister_kfunc_btf_id_set); + +#endif + +#define DEFINE_KFUNC_BTF_ID_LIST(name) \ + struct kfunc_btf_id_list name = { LIST_HEAD_INIT(name.list), \ + __MUTEX_INITIALIZER(name.mutex) }; \ + EXPORT_SYMBOL_GPL(name) + +DEFINE_KFUNC_BTF_ID_LIST(bpf_tcp_ca_kfunc_list); +DEFINE_KFUNC_BTF_ID_LIST(prog_test_kfunc_list); + /* All definitions of tracepoints related to BPF. */ #define CREATE_TRACE_POINTS #include <linux/bpf_trace.h> -- 2.33.1