Re: [PATCH v3 11/21] objtool: Allow empty alternatives

Josh Poimboeuf <[email protected]>
Newsgroups org.kernel.vger.live-patching,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-kernel
Message-ID <ykyqrueqcpoxuondp2hcbjpqnmvshxmlqinlqamsmb626rd7h7@x64cqzsmlqr5>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.