• Arnd Bergmann's avatar
    arm64/io: add constant-argument check · 5c40e428
    Arnd Bergmann authored
    In some configurations __const_iowrite32_copy() does not get inlined
    and gcc runs into the BUILD_BUG():
    
    In file included from <command-line>:
    In function '__const_memcpy_toio_aligned32',
        inlined from '__const_iowrite32_copy' at arch/arm64/include/asm/io.h:203:3,
        inlined from '__const_iowrite32_copy' at arch/arm64/include/asm/io.h:199:20:
    include/linux/compiler_types.h:487:45: error: call to '__compiletime_assert_538' declared with attribute error: BUILD_BUG failed
      487 |         _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
          |                                             ^
    include/linux/compiler_types.h:468:25: note: in definition of macro '__compiletime_assert'
      468 |                         prefix ## suffix();                             \
          |                         ^~~~~~
    include/linux/compiler_types.h:487:9: note: in expansion of macro '_compiletime_assert'
      487 |         _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
          |         ^~~~~~~~~~~~~~~~~~~
    include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
       39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
          |                                     ^~~~~~~~~~~~~~~~~~
    include/linux/build_bug.h:59:21: note: in expansion of macro 'BUILD_BUG_ON_MSG'
       59 | #define BUILD_BUG() BUILD_BUG_ON_MSG(1, "BUILD_BUG failed")
          |                     ^~~~~~~~~~~~~~~~
    arch/arm64/include/asm/io.h:193:17: note: in expansion of macro 'BUILD_BUG'
      193 |                 BUILD_BUG();
          |                 ^~~~~~~~~
    
    Move the check for constant arguments into the inline function to ensure
    it is still constant if the compiler decides against inlining it, and
    mark them as __always_inline to override the logic that sometimes leads
    to the compiler not producing the simplified output.
    
    Note that either the __always_inline annotation or the check for a
    constant value are sufficient here, but combining the two looks cleaner
    as it also avoids the macro. With clang-8 and older, the macro was still
    needed, but all versions of gcc and clang can reliably perform constant
    folding here.
    
    Fixes: ead79118 ("arm64/io: Provide a WC friendly __iowriteXX_copy()")
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    Reviewed-by: default avatarMark Rutland <mark.rutland@arm.com>
    Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/20240604210006.668912-1-arnd@kernel.orgSigned-off-by: default avatarWill Deacon <will@kernel.org>
    5c40e428
io.h 8.96 KB