bpf: btf: limit logging of ignored BTF mismatches
Enabling CONFIG_MODULE_ALLOW_BTF_MISMATCH is an indication that BTF mismatches are expected and module loading should proceed anyway. Logging with pr_warn() on every one of these "benign" mismatches creates unnecessary noise when many such modules are loaded. Instead, handle this case with a single log warning that BTF info may be unavailable. Mismatches also result in calls to __btf_verifier_log() via __btf_verifier_log_type() or btf_verifier_log_member(), adding several additional lines of logging per mismatched module. Add checks to these paths to skip logging for module BTF mismatches in the "allow mismatch" case. All existing logging behavior is preserved in the default CONFIG_MODULE_ALLOW_BTF_MISMATCH=n case. Signed-off-by: Connor O'Brien <connoro@google.com> Acked-by: Yonghong Song <yhs@fb.com> Link: https://lore.kernel.org/r/20230107025331.3240536-1-connoro@google.com Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
This commit is contained in:
parent
7f78804957
commit
9cb61e50bf
@ -1397,12 +1397,18 @@ __printf(4, 5) static void __btf_verifier_log_type(struct btf_verifier_env *env,
|
||||
if (!bpf_verifier_log_needed(log))
|
||||
return;
|
||||
|
||||
/* btf verifier prints all types it is processing via
|
||||
* btf_verifier_log_type(..., fmt = NULL).
|
||||
* Skip those prints for in-kernel BTF verification.
|
||||
*/
|
||||
if (log->level == BPF_LOG_KERNEL && !fmt)
|
||||
return;
|
||||
if (log->level == BPF_LOG_KERNEL) {
|
||||
/* btf verifier prints all types it is processing via
|
||||
* btf_verifier_log_type(..., fmt = NULL).
|
||||
* Skip those prints for in-kernel BTF verification.
|
||||
*/
|
||||
if (!fmt)
|
||||
return;
|
||||
|
||||
/* Skip logging when loading module BTF with mismatches permitted */
|
||||
if (env->btf->base_btf && IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH))
|
||||
return;
|
||||
}
|
||||
|
||||
__btf_verifier_log(log, "[%u] %s %s%s",
|
||||
env->log_type_id,
|
||||
@ -1441,8 +1447,15 @@ static void btf_verifier_log_member(struct btf_verifier_env *env,
|
||||
if (!bpf_verifier_log_needed(log))
|
||||
return;
|
||||
|
||||
if (log->level == BPF_LOG_KERNEL && !fmt)
|
||||
return;
|
||||
if (log->level == BPF_LOG_KERNEL) {
|
||||
if (!fmt)
|
||||
return;
|
||||
|
||||
/* Skip logging when loading module BTF with mismatches permitted */
|
||||
if (env->btf->base_btf && IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH))
|
||||
return;
|
||||
}
|
||||
|
||||
/* The CHECK_META phase already did a btf dump.
|
||||
*
|
||||
* If member is logged again, it must hit an error in
|
||||
@ -7261,11 +7274,14 @@ static int btf_module_notify(struct notifier_block *nb, unsigned long op,
|
||||
}
|
||||
btf = btf_parse_module(mod->name, mod->btf_data, mod->btf_data_size);
|
||||
if (IS_ERR(btf)) {
|
||||
pr_warn("failed to validate module [%s] BTF: %ld\n",
|
||||
mod->name, PTR_ERR(btf));
|
||||
kfree(btf_mod);
|
||||
if (!IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH))
|
||||
if (!IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH)) {
|
||||
pr_warn("failed to validate module [%s] BTF: %ld\n",
|
||||
mod->name, PTR_ERR(btf));
|
||||
err = PTR_ERR(btf);
|
||||
} else {
|
||||
pr_warn_once("Kernel module BTF mismatch detected, BTF debug info may be unavailable for some modules\n");
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
err = btf_alloc_id(btf);
|
||||
|
Loading…
Reference in New Issue
Block a user