On Fri, Aug 07, 2026 at 04:40:34PM -0700, Josh Poimboeuf wrote: > On Wed, May 13, 2026 at 09:37:11AM +0200, Peter Zijlstra wrote: > > On Tue, May 12, 2026 at 08:33:45PM -0700, Josh Poimboeuf wrote: > > > arm64 can have empty alternatives, which are effectively no-ops. Ignore > > > them. While at it, fix a memory leak. > > > > How does this happen? > > Yeah, that commit log sucks... > > The case I stumbled on was the dcache_by_myline_op_nosync macro: > > alternative_if ARM64_WORKAROUND_4311569 > .ifnc \op, cvau > mov \start, \tmp > mov \tmp, xzr > cbnz \start, .Ldcache_op\@ > .endif > alternative_else_nop_endif > > That's actually a bit weird, the .ifnc should probably be outside the > alternative_if. Let me try fixing that instead.
I'll probably drop the above patch (leaving empty alternatives as a hard error) and replace it with this one: commit 5dd83bdddff38f4df2829b05f876e57215b2e850 Author: Josh Poimboeuf <[email protected]> Date: Fri Aug 7 16:41:10 2026 -0700 arm64: Remove unnecessary empty alternatives The code in arch/arm64/mm/cache.S creates three empty alternatives, all from calling the dcache_by_myline_op_nosync asm macro. If \op == cvau, it creates an empty alternative for ARM64_WORKAROUND_4311569. Since orig_len == 0, the alternative patching code mostly ignores it, though it does do an unnecessary clean_dcache_range_nopatch(). It also triggers an objtool error ("empty alternative entry"). Clean it up by moving the .ifnc check outside the alternative emit. Signed-off-by: Josh Poimboeuf <[email protected]> diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h index effae53e9739d..6e059efced5bb 100644 --- a/arch/arm64/include/asm/assembler.h +++ b/arch/arm64/include/asm/assembler.h @@ -404,13 +404,13 @@ alternative_else_nop_endif add \start, \start, \linesz cmp \start, \end b.lo .Ldcache_op\@ -alternative_if ARM64_WORKAROUND_4311569 .ifnc \op, cvau +alternative_if ARM64_WORKAROUND_4311569 mov \start, \tmp mov \tmp, xzr cbnz \start, .Ldcache_op\@ - .endif alternative_else_nop_endif + .endif _cond_uaccess_extable .Ldcache_op\@, \fixup .endm

