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 - 2024 Red Hat, Inc.