]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
x86: Handle KCOV __init vs inline mismatches
authorKees Cook <kees@kernel.org>
Thu, 24 Jul 2025 05:50:26 +0000 (22:50 -0700)
committerKees Cook <kees@kernel.org>
Thu, 24 Jul 2025 23:55:11 +0000 (16:55 -0700)
commit8245d47cfaba8a38337a447230b4d01f9946f5e1
tree812c211e2c936af10a295d242b2488abdb144778
parent65c430906efffee9bd7551d474f01a6b1197df90
x86: Handle KCOV __init vs inline mismatches

GCC appears to have kind of fragile inlining heuristics, in the
sense that it can change whether or not it inlines something based on
optimizations. It looks like the kcov instrumentation being added (or in
this case, removed) from a function changes the optimization results,
and some functions marked "inline" are _not_ inlined. In that case,
we end up with __init code calling a function not marked __init, and we
get the build warnings I'm trying to eliminate in the coming patch that
adds __no_sanitize_coverage to __init functions:

WARNING: modpost: vmlinux: section mismatch in reference: xbc_exit+0x8 (section: .text.unlikely) -> _xbc_exit (section: .init.text)
WARNING: modpost: vmlinux: section mismatch in reference: real_mode_size_needed+0x15 (section: .text.unlikely) -> real_mode_blob_end (section: .init.data)
WARNING: modpost: vmlinux: section mismatch in reference: __set_percpu_decrypted+0x16 (section: .text.unlikely) -> early_set_memory_decrypted (section: .init.text)
WARNING: modpost: vmlinux: section mismatch in reference: memblock_alloc_from+0x26 (section: .text.unlikely) -> memblock_alloc_try_nid (section: .init.text)
WARNING: modpost: vmlinux: section mismatch in reference: acpi_arch_set_root_pointer+0xc (section: .text.unlikely) -> x86_init (section: .init.data)
WARNING: modpost: vmlinux: section mismatch in reference: acpi_arch_get_root_pointer+0x8 (section: .text.unlikely) -> x86_init (section: .init.data)
WARNING: modpost: vmlinux: section mismatch in reference: efi_config_table_is_usable+0x16 (section: .text.unlikely) -> xen_efi_config_table_is_usable (section: .init.text)

This problem is somewhat fragile (though using either __always_inline
or __init will deterministically solve it), but we've tripped over
this before with GCC and the solution has usually been to just use
__always_inline and move on.

For x86 this means forcing several functions to be inline with
__always_inline.

Link: https://lore.kernel.org/r/20250724055029.3623499-2-kees@kernel.org
Signed-off-by: Kees Cook <kees@kernel.org>
arch/x86/include/asm/acpi.h
arch/x86/include/asm/realmode.h
arch/x86/kernel/kvm.c
arch/x86/mm/init_64.c
include/linux/acpi.h
include/linux/bootconfig.h
include/linux/efi.h
include/linux/memblock.h
include/linux/smp.h
kernel/kexec_handover.c