bpf: Make CONFIG_DEBUG_INFO_BTF depend upon CONFIG_BPF_SYSCALL
Vinicius Costa Gomes reported [0] that build fails when
CONFIG_DEBUG_INFO_BTF is enabled and CONFIG_BPF_SYSCALL is disabled.
This leads to btf.c not being compiled, and then no symbol being present
in vmlinux for the declarations in btf.h. Since BTF is not useful
without enabling BPF subsystem, disallow this combination.
However, theoretically disabling both now could still fail, as the
symbol for kfunc_btf_id_list variables is not available. This isn't a
problem as the compiler usually optimizes the whole register/unregister
call, but at lower optimization levels it can fail the build in linking
stage.
Fix that by adding dummy variables so that modules taking address of
them still work, but the whole thing is a noop.
[0]: https://lore.kernel.org/bpf/20211110205418.332403-1-vinicius.gomes@intel.com
Fixes: 14f267d95f
("bpf: btf: Introduce helpers for dynamic BTF set registration")
Reported-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Song Liu <songliubraving@fb.com>
Link: https://lore.kernel.org/bpf/20211122144742.477787-2-memxor@gmail.com
This commit is contained in:
Родитель
099f83aa2d
Коммит
d9847eb8be
|
@ -245,7 +245,10 @@ struct kfunc_btf_id_set {
|
||||||
struct module *owner;
|
struct module *owner;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct kfunc_btf_id_list;
|
struct kfunc_btf_id_list {
|
||||||
|
struct list_head list;
|
||||||
|
struct mutex mutex;
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_INFO_BTF_MODULES
|
#ifdef CONFIG_DEBUG_INFO_BTF_MODULES
|
||||||
void register_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
|
void register_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
|
||||||
|
@ -254,6 +257,9 @@ void unregister_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
|
||||||
struct kfunc_btf_id_set *s);
|
struct kfunc_btf_id_set *s);
|
||||||
bool bpf_check_mod_kfunc_call(struct kfunc_btf_id_list *klist, u32 kfunc_id,
|
bool bpf_check_mod_kfunc_call(struct kfunc_btf_id_list *klist, u32 kfunc_id,
|
||||||
struct module *owner);
|
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
|
#else
|
||||||
static inline void register_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
|
static inline void register_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
|
||||||
struct kfunc_btf_id_set *s)
|
struct kfunc_btf_id_set *s)
|
||||||
|
@ -268,13 +274,13 @@ static inline bool bpf_check_mod_kfunc_call(struct kfunc_btf_id_list *klist,
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
#endif
|
||||||
|
|
||||||
#define DEFINE_KFUNC_BTF_ID_SET(set, name) \
|
#define DEFINE_KFUNC_BTF_ID_SET(set, name) \
|
||||||
struct kfunc_btf_id_set name = { LIST_HEAD_INIT(name.list), (set), \
|
struct kfunc_btf_id_set name = { LIST_HEAD_INIT(name.list), (set), \
|
||||||
THIS_MODULE }
|
THIS_MODULE }
|
||||||
|
|
||||||
extern struct kfunc_btf_id_list bpf_tcp_ca_kfunc_list;
|
|
||||||
extern struct kfunc_btf_id_list prog_test_kfunc_list;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -6346,11 +6346,6 @@ BTF_ID_LIST_GLOBAL_SINGLE(btf_task_struct_ids, struct, task_struct)
|
||||||
|
|
||||||
/* BTF ID set registration API for modules */
|
/* 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
|
#ifdef CONFIG_DEBUG_INFO_BTF_MODULES
|
||||||
|
|
||||||
void register_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
|
void register_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
|
||||||
|
@ -6389,8 +6384,6 @@ bool bpf_check_mod_kfunc_call(struct kfunc_btf_id_list *klist, u32 kfunc_id,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define DEFINE_KFUNC_BTF_ID_LIST(name) \
|
#define DEFINE_KFUNC_BTF_ID_LIST(name) \
|
||||||
struct kfunc_btf_id_list name = { LIST_HEAD_INIT(name.list), \
|
struct kfunc_btf_id_list name = { LIST_HEAD_INIT(name.list), \
|
||||||
__MUTEX_INITIALIZER(name.mutex) }; \
|
__MUTEX_INITIALIZER(name.mutex) }; \
|
||||||
|
@ -6398,3 +6391,5 @@ bool bpf_check_mod_kfunc_call(struct kfunc_btf_id_list *klist, u32 kfunc_id,
|
||||||
|
|
||||||
DEFINE_KFUNC_BTF_ID_LIST(bpf_tcp_ca_kfunc_list);
|
DEFINE_KFUNC_BTF_ID_LIST(bpf_tcp_ca_kfunc_list);
|
||||||
DEFINE_KFUNC_BTF_ID_LIST(prog_test_kfunc_list);
|
DEFINE_KFUNC_BTF_ID_LIST(prog_test_kfunc_list);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -316,6 +316,7 @@ config DEBUG_INFO_BTF
|
||||||
bool "Generate BTF typeinfo"
|
bool "Generate BTF typeinfo"
|
||||||
depends on !DEBUG_INFO_SPLIT && !DEBUG_INFO_REDUCED
|
depends on !DEBUG_INFO_SPLIT && !DEBUG_INFO_REDUCED
|
||||||
depends on !GCC_PLUGIN_RANDSTRUCT || COMPILE_TEST
|
depends on !GCC_PLUGIN_RANDSTRUCT || COMPILE_TEST
|
||||||
|
depends on BPF_SYSCALL
|
||||||
help
|
help
|
||||||
Generate deduplicated BTF type information from DWARF debug info.
|
Generate deduplicated BTF type information from DWARF debug info.
|
||||||
Turning this on expects presence of pahole tool, which will convert
|
Turning this on expects presence of pahole tool, which will convert
|
||||||
|
|
Загрузка…
Ссылка в новой задаче