On Wed, 2023-01-25 at 09:43 +0000, Christophe Leroy wrote: > By the way, are you should the problem is really BUILD_BUG() ? > Looking > at your patch I would think that the problem is because it is "static > inline". Have you tried 'static __always_inline' instead ?
I did not try it, so I just did but it doesn't make a difference. Looking further, the failing config also enabled CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG, which causes the mmu_has_feature(MMU_FTR_TYPE_RADIX) call of radix_enabled() to be non- trivial. It must check static_key_initialized, and falls back to early_mmu_has_feature if it triggers. Clang apparently can't see that early_mmu_has_feature will also always return false for Radix, so doesn't see that everything guarded by radix_enabled() is dead code. I suppose it's complicated by the fact it still has to run mmu_has_feature for the assertion side effect despite the return value being knowable at compile time. So because of this weird interaction, the following should (and does) also prevent the compilation error by making the radix_enabled() return value more obvious to the compiler in the case where Radix is not implemented. (I've put the constant second here so the early usage assertion still runs). diff --git a/arch/powerpc/include/asm/mmu.h b/arch/powerpc/include/asm/mmu.h index 94b981152667..3592ff9a522b 100644 --- a/arch/powerpc/include/asm/mmu.h +++ b/arch/powerpc/include/asm/mmu.h @@ -327,7 +327,7 @@ static inline void assert_pte_locked(struct mm_struct *mm, unsigned long addr) static __always_inline bool radix_enabled(void) { - return mmu_has_feature(MMU_FTR_TYPE_RADIX); + return mmu_has_feature(MMU_FTR_TYPE_RADIX) && IS_ENABLED(CONFIG_PPC_RADIX_MMU); } static __always_inline bool early_radix_enabled(void)