[PATCH] iommupt/amdv1: mark amdv1pt_install_leaf_entry as __always_inline

Sherry Yang posted 1 patch 1 week ago
drivers/iommu/generic_pt/fmt/amdv1.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
[PATCH] iommupt/amdv1: mark amdv1pt_install_leaf_entry as __always_inline
Posted by Sherry Yang 1 week ago
After enabling CONFIG_GCOV_KERNEL and CONFIG_GCOV_PROFILE_ALL, following
build failure is observed under GCC 14.2.1:

In function 'amdv1pt_install_leaf_entry',
    inlined from '__do_map_single_page' at drivers/iommu/generic_pt/fmt/../iommu_pt.h:650:3,
    inlined from '__map_single_page0' at drivers/iommu/generic_pt/fmt/../iommu_pt.h:661:1,
    inlined from 'pt_descend' at drivers/iommu/generic_pt/fmt/../pt_iter.h:391:9,
    inlined from '__do_map_single_page' at drivers/iommu/generic_pt/fmt/../iommu_pt.h:657:10,
    inlined from '__map_single_page1.constprop' at drivers/iommu/generic_pt/fmt/../iommu_pt.h:661:1:
././include/linux/compiler_types.h:706:45: error: call to '__compiletime_assert_71' declared with attribute error: FIELD_PREP: value too large for the field
  706 |         _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
      |

......

drivers/iommu/generic_pt/fmt/amdv1.h:220:26: note: in expansion of macro 'FIELD_PREP'
  220 |                          FIELD_PREP(AMDV1PT_FMT_OA,
      |                          ^~~~~~~~~~

In the path '__do_map_single_page()', level 0 always invokes
'pt_install_leaf_entry(&pts, map->oa, PAGE_SHIFT, …)'. At runtime that
lands in the 'if (oasz_lg2 == isz_lg2)' arm of 'amdv1pt_install_leaf_entry()';
the contiguous-only 'else' block is unreachable for 4 KiB pages.

With CONFIG_GCOV_KERNEL + CONFIG_GCOV_PROFILE_ALL, the extra
instrumentation changes GCC's inlining so that the "dead" 'else' branch
still gets instantiated. The compiler constant-folds the contiguous OA
expression, runs the 'FIELD_PREP()' compile-time check, and produces:

    FIELD_PREP: value too large for the field

gcov-enabled builds therefore fail even though the code path never executes.

Fix this by marking amdv1pt_install_leaf_entry as __always_inline.

Fixes: dcd6a011a8d5 ("iommupt: Add map_pages op")
Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Sherry Yang <sherry.yang@oracle.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.50.1

Re: [PATCH] iommupt/amdv1: mark amdv1pt_install_leaf_entry as __always_inline
Posted by Vasant Hegde 3 days, 1 hour ago

On 3/26/2026 9:47 PM, Sherry Yang wrote:
> After enabling CONFIG_GCOV_KERNEL and CONFIG_GCOV_PROFILE_ALL, following
> build failure is observed under GCC 14.2.1:
> 
> In function 'amdv1pt_install_leaf_entry',
>     inlined from '__do_map_single_page' at drivers/iommu/generic_pt/fmt/../iommu_pt.h:650:3,
>     inlined from '__map_single_page0' at drivers/iommu/generic_pt/fmt/../iommu_pt.h:661:1,
>     inlined from 'pt_descend' at drivers/iommu/generic_pt/fmt/../pt_iter.h:391:9,
>     inlined from '__do_map_single_page' at drivers/iommu/generic_pt/fmt/../iommu_pt.h:657:10,
>     inlined from '__map_single_page1.constprop' at drivers/iommu/generic_pt/fmt/../iommu_pt.h:661:1:
> ././include/linux/compiler_types.h:706:45: error: call to '__compiletime_assert_71' declared with attribute error: FIELD_PREP: value too large for the field
>   706 |         _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
>       |
> 
> ......
> 
> drivers/iommu/generic_pt/fmt/amdv1.h:220:26: note: in expansion of macro 'FIELD_PREP'
>   220 |                          FIELD_PREP(AMDV1PT_FMT_OA,
>       |                          ^~~~~~~~~~
> 
> In the path '__do_map_single_page()', level 0 always invokes
> 'pt_install_leaf_entry(&pts, map->oa, PAGE_SHIFT, …)'. At runtime that
> lands in the 'if (oasz_lg2 == isz_lg2)' arm of 'amdv1pt_install_leaf_entry()';
> the contiguous-only 'else' block is unreachable for 4 KiB pages.
> 
> With CONFIG_GCOV_KERNEL + CONFIG_GCOV_PROFILE_ALL, the extra
> instrumentation changes GCC's inlining so that the "dead" 'else' branch
> still gets instantiated. The compiler constant-folds the contiguous OA
> expression, runs the 'FIELD_PREP()' compile-time check, and produces:
> 
>     FIELD_PREP: value too large for the field
> 
> gcov-enabled builds therefore fail even though the code path never executes.
> 
> Fix this by marking amdv1pt_install_leaf_entry as __always_inline.
> 
> Fixes: dcd6a011a8d5 ("iommupt: Add map_pages op")
> Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
> Signed-off-by: Sherry Yang <sherry.yang@oracle.com>

Reviewed-by: Vasant Hegde <vasant.hegde@amd.com>

-Vasant

Re: [PATCH] iommupt/amdv1: mark amdv1pt_install_leaf_entry as __always_inline
Posted by Jörg Rödel 6 days, 10 hours ago
On Thu, Mar 26, 2026 at 09:17:19AM -0700, Sherry Yang wrote:
> Fixes: dcd6a011a8d5 ("iommupt: Add map_pages op")
> Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
> Signed-off-by: Sherry Yang <sherry.yang@oracle.com>
> ---
>  drivers/iommu/generic_pt/fmt/amdv1.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

Applied, thanks.