From: Geliang Tang <tanggeliang@kylinos.cn>
To let the modules loaded, commit 3de4d22cc9ac ("bpf, btf: Warn but
return no error for NULL btf from __register_btf_kfunc_id_set()")
changes the return value of __register_btf_kfunc_id_set() from -ENOENT
to 0 when btf is NULL.
A better way to do this is to enable CONFIG_MODULE_ALLOW_BTF_MISMATCH.
An error code -ENOENT should indeed be returned when kernel module BTF
mismatch detected except CONFIG_MODULE_ALLOW_BTF_MISMATCH is enabled in
__register_btf_kfunc_id_set().
The same in register_btf_id_dtor_kfuncs(), give the modules a chance
to be loaded when CONFIG_MODULE_ALLOW_BTF_MISMATCH is enabled.
Fixes: 3de4d22cc9ac ("bpf, btf: Warn but return no error for NULL btf from __register_btf_kfunc_id_set()")
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
kernel/bpf/btf.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
index f7725cb6e564..203391e61d93 100644
--- a/kernel/bpf/btf.c
+++ b/kernel/bpf/btf.c
@@ -8103,8 +8103,11 @@ static int __register_btf_kfunc_id_set(enum btf_kfunc_hook hook,
pr_err("missing vmlinux BTF, cannot register kfuncs\n");
return -ENOENT;
}
- if (kset->owner && IS_ENABLED(CONFIG_DEBUG_INFO_BTF_MODULES))
+ if (kset->owner && IS_ENABLED(CONFIG_DEBUG_INFO_BTF_MODULES) &&
+ !IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH)) {
pr_warn("missing module BTF, cannot register kfuncs\n");
+ return -ENOENT;
+ }
return 0;
}
if (IS_ERR(btf))
@@ -8219,7 +8222,8 @@ int register_btf_id_dtor_kfuncs(const struct btf_id_dtor_kfunc *dtors, u32 add_c
pr_err("missing vmlinux BTF, cannot register dtor kfuncs\n");
return -ENOENT;
}
- if (owner && IS_ENABLED(CONFIG_DEBUG_INFO_BTF_MODULES)) {
+ if (owner && IS_ENABLED(CONFIG_DEBUG_INFO_BTF_MODULES) &&
+ !IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH)) {
pr_err("missing module BTF, cannot register dtor kfuncs\n");
return -ENOENT;
}
--
2.40.1
On 2/7/24 6:07 AM, Geliang Tang wrote:
> From: Geliang Tang <tanggeliang@kylinos.cn>
>
> To let the modules loaded, commit 3de4d22cc9ac ("bpf, btf: Warn but
> return no error for NULL btf from __register_btf_kfunc_id_set()")
> changes the return value of __register_btf_kfunc_id_set() from -ENOENT
> to 0 when btf is NULL.
>
> A better way to do this is to enable CONFIG_MODULE_ALLOW_BTF_MISMATCH.
>
> An error code -ENOENT should indeed be returned when kernel module BTF
> mismatch detected except CONFIG_MODULE_ALLOW_BTF_MISMATCH is enabled in
> __register_btf_kfunc_id_set().
>
> The same in register_btf_id_dtor_kfuncs(), give the modules a chance
> to be loaded when CONFIG_MODULE_ALLOW_BTF_MISMATCH is enabled.
>
> Fixes: 3de4d22cc9ac ("bpf, btf: Warn but return no error for NULL btf from __register_btf_kfunc_id_set()")
> Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
> ---
> kernel/bpf/btf.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
> index f7725cb6e564..203391e61d93 100644
> --- a/kernel/bpf/btf.c
> +++ b/kernel/bpf/btf.c
> @@ -8103,8 +8103,11 @@ static int __register_btf_kfunc_id_set(enum btf_kfunc_hook hook,
> pr_err("missing vmlinux BTF, cannot register kfuncs\n");
> return -ENOENT;
> }
> - if (kset->owner && IS_ENABLED(CONFIG_DEBUG_INFO_BTF_MODULES))
> + if (kset->owner && IS_ENABLED(CONFIG_DEBUG_INFO_BTF_MODULES) &&
> + !IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH)) {
I am not sure this new test can be added here now. Otherwise, the existing
kconfig that does not have CONFIG_MODULE_ALLOW_BTF_MISMATCH set will fail to
load a module with btf section stripped out as described in commit 3de4d22cc9ac.
A module with stripped btf section does not mean BTF_MISMATCH also.
> pr_warn("missing module BTF, cannot register kfuncs\n");
> + return -ENOENT;
> + }
> return 0;
> }
> if (IS_ERR(btf))
> @@ -8219,7 +8222,8 @@ int register_btf_id_dtor_kfuncs(const struct btf_id_dtor_kfunc *dtors, u32 add_c
> pr_err("missing vmlinux BTF, cannot register dtor kfuncs\n");
> return -ENOENT;
> }
> - if (owner && IS_ENABLED(CONFIG_DEBUG_INFO_BTF_MODULES)) {
> + if (owner && IS_ENABLED(CONFIG_DEBUG_INFO_BTF_MODULES) &&
> + !IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH)) {
> pr_err("missing module BTF, cannot register dtor kfuncs\n");
> return -ENOENT;
> }
© 2016 - 2026 Red Hat, Inc.