| From 315ca7aeb0d86c841a852202526d21d2b43d720f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 23 Jul 2025 22:50:25 -0700 |
| Subject: arm64: Handle KCOV __init vs inline mismatches |
| |
| From: Kees Cook <kees@kernel.org> |
| |
| [ Upstream commit 65c430906efffee9bd7551d474f01a6b1197df90 ] |
| |
| 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: acpi_get_enable_method+0x1c (section: .text.unlikely) -> acpi_psci_present (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 arm64 this requires forcing one ACPI function to be inlined with |
| __always_inline. |
| |
| Link: https://lore.kernel.org/r/20250724055029.3623499-1-kees@kernel.org |
| Signed-off-by: Kees Cook <kees@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/arm64/include/asm/acpi.h | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/arch/arm64/include/asm/acpi.h b/arch/arm64/include/asm/acpi.h |
| index 702587fda70c..8cbbd08cc8c5 100644 |
| --- a/arch/arm64/include/asm/acpi.h |
| +++ b/arch/arm64/include/asm/acpi.h |
| @@ -128,7 +128,7 @@ acpi_set_mailbox_entry(int cpu, struct acpi_madt_generic_interrupt *processor) |
| {} |
| #endif |
| |
| -static inline const char *acpi_get_enable_method(int cpu) |
| +static __always_inline const char *acpi_get_enable_method(int cpu) |
| { |
| if (acpi_psci_present()) |
| return "psci"; |
| -- |
| 2.39.5 |
| |