drivers/iommu/generic_pt/fmt/Makefile | 2 ++ 1 file changed, 2 insertions(+)
This patch fixes a build failure in drivers/iommu/generic_pt/fmt/iommu_amdv1.o when -fprofile-update=atomic is added to global CFLAGS_GCOV. This is part of a larger effort to add -fprofile-update=atomic to global CFLAGS_GCOV to fix GCOV counter races that cause crashes on SMP (posted earlier as a combined series): https://lore.kernel.org/lkml/20260401142020.1434243-1-khorenko@virtuozzo.com/T/#t That combined series was split per subsystem as requested by reviewers. The companion patches are: - net: fix skb_ext BUILD_BUG_ON failures (sent to netdev) - gcov: add -fprofile-update=atomic globally (sent to gcov/kbuild maintainers, depends on this patch and the net patches) FIELD_PREP() compile-time checks fail because the entire call chain is __always_inline functions generated by PT_MAKE_LEVELS(), and GCC's .constprop cloning creates new profiled function bodies that bypass __no_profile. Disabling GCOV for the file is the only viable fix. Konstantin Khorenko (1): iommu/generic_pt: disable GCOV for iommu_amdv1.o drivers/iommu/generic_pt/fmt/Makefile | 2 ++ 1 file changed, 2 insertions(+) -- 2.43.5
This patch fixes a build failure in drivers/iommu/generic_pt/fmt/iommu_amdv1.o
when -fprofile-update=atomic is added to global CFLAGS_GCOV.
v2: Use __always_inline instead of disabling GCOV for the file, as
suggested by Jason Gunthorpe. The root cause is that
amdv1pt_install_leaf_entry() is "static inline" (not __always_inline),
so GCC may choose not to inline it. Without inlining, the compiler
cannot see constant arguments at the call site and fails to eliminate
the impossible branch in FIELD_PREP(). Forcing inlining via
__always_inline solves the problem without losing GCOV coverage.
v1: https://lore.kernel.org/lkml/20260401142020.1434243-4-khorenko@virtuozzo.com/
This is part of a larger effort to add -fprofile-update=atomic to
global CFLAGS_GCOV to fix GCOV counter races that cause crashes on SMP
(posted earlier as a combined series):
https://lore.kernel.org/lkml/20260401142020.1434243-1-khorenko@virtuozzo.com/T/#t
That combined series was split per subsystem as requested by reviewers.
The companion patches are:
- net: fix skb_ext BUILD_BUG_ON failures (sent to netdev) [1]
- gcov: add -fprofile-update=atomic globally (sent to gcov/kbuild
maintainers, depends on this patch and the net patches) [2]
[1] https://lore.kernel.org/lkml/20260402140558.1437002-1-khorenko@virtuozzo.com/T/#t
[2] https://lore.kernel.org/lkml/20260402141831.1437357-1-khorenko@virtuozzo.com/T/#t
Konstantin Khorenko (1):
iommu/generic_pt: use __always_inline for amdv1pt_install_leaf_entry()
drivers/iommu/generic_pt/fmt/amdv1.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--
2.43.5
With -fprofile-update=atomic in CFLAGS_GCOV, GCC fails to eliminate
an impossible branch in FIELD_PREP() inside amdv1pt_install_leaf_entry()
when the function is merely "static inline". GCC may choose not to
inline it, and without seeing the constant arguments at the call site
it cannot prove the FIELD_PREP value fits the field.
Change from "static inline" to "static __always_inline" so GCC is
forced to inline the function and can see the constant values,
allowing dead code elimination of the impossible branch.
Signed-off-by: Konstantin Khorenko <khorenko@virtuozzo.com>
---
drivers/iommu/generic_pt/fmt/amdv1.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/iommu/generic_pt/fmt/amdv1.h b/drivers/iommu/generic_pt/fmt/amdv1.h
index 3b2c41d9654d..8d11b08291d7 100644
--- a/drivers/iommu/generic_pt/fmt/amdv1.h
+++ b/drivers/iommu/generic_pt/fmt/amdv1.h
@@ -191,7 +191,7 @@ static inline enum pt_entry_type amdv1pt_load_entry_raw(struct pt_state *pts)
}
#define pt_load_entry_raw amdv1pt_load_entry_raw
-static inline void
+static __always_inline void
amdv1pt_install_leaf_entry(struct pt_state *pts, pt_oaddr_t oa,
unsigned int oasz_lg2,
const struct pt_write_attrs *attrs)
--
2.43.5
On Thu, Apr 09, 2026 at 08:01:17PM +0300, Konstantin Khorenko wrote:
> With -fprofile-update=atomic in CFLAGS_GCOV, GCC fails to eliminate
> an impossible branch in FIELD_PREP() inside amdv1pt_install_leaf_entry()
> when the function is merely "static inline". GCC may choose not to
> inline it, and without seeing the constant arguments at the call site
> it cannot prove the FIELD_PREP value fits the field.
>
> Change from "static inline" to "static __always_inline" so GCC is
> forced to inline the function and can see the constant values,
> allowing dead code elimination of the impossible branch.
>
> Signed-off-by: Konstantin Khorenko <khorenko@virtuozzo.com>
> ---
> drivers/iommu/generic_pt/fmt/amdv1.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
It was already merged:
commit 8b72aa5704c77380742346d4ac755b074b7f9eaa
Author: Sherry Yang <sherry.yang@oracle.com>
Date: Thu Mar 26 09:17:19 2026 -0700
iommupt/amdv1: mark amdv1pt_install_leaf_entry as __always_inline
After enabling CONFIG_GCOV_KERNEL and CONFIG_GCOV_PROFILE_ALL, following
build failure is observed under GCC 14.2.1:
© 2016 - 2026 Red Hat, Inc.