[PATCH 0/1] iommu/generic_pt: disable GCOV for iommu_amdv1.o

Konstantin Khorenko posted 1 patch 2 months, 1 week ago
Only 0 patches received!
There is a newer version of this series
drivers/iommu/generic_pt/fmt/Makefile | 2 ++
1 file changed, 2 insertions(+)
[PATCH 0/1] iommu/generic_pt: disable GCOV for iommu_amdv1.o
Posted by Konstantin Khorenko 2 months, 1 week ago
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
[PATCH v2 0/1] iommu/generic_pt: fix GCOV build failure for amdv1
Posted by Konstantin Khorenko 2 months ago
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
[PATCH v2] iommu/generic_pt: use __always_inline for amdv1pt_install_leaf_entry()
Posted by Konstantin Khorenko 2 months ago
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
Re: [PATCH v2] iommu/generic_pt: use __always_inline for amdv1pt_install_leaf_entry()
Posted by Jason Gunthorpe 2 months ago
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: