On Sun, Dec 14, 2025 at 11:22:44AM +0000, Yeoreum Yun wrote: > Refactor futex atomic operations using ll/sc method with > clearing PSTATE.PAN to prepare to apply FEAT_LSUI on them. > > Signed-off-by: Yeoreum Yun <[email protected]> > Reviewed-by: Catalin Marinas <[email protected]> > --- > arch/arm64/include/asm/futex.h | 128 +++++++++++++++++++++------------ > 1 file changed, 82 insertions(+), 46 deletions(-) > > diff --git a/arch/arm64/include/asm/futex.h b/arch/arm64/include/asm/futex.h > index bc06691d2062..f8cb674bdb3f 100644 > --- a/arch/arm64/include/asm/futex.h > +++ b/arch/arm64/include/asm/futex.h > @@ -7,17 +7,21 @@ > > #include <linux/futex.h> > #include <linux/uaccess.h> > +#include <linux/stringify.h> > > #include <asm/errno.h> > > #define FUTEX_MAX_LOOPS 128 /* What's the largest number you can think > of? */ > > -#define __futex_atomic_op(insn, ret, oldval, uaddr, tmp, oparg) > \ > -do { \ > +#define LLSC_FUTEX_ATOMIC_OP(op, insn) > \ > +static __always_inline int \ > +__llsc_futex_atomic_##op(int oparg, u32 __user *uaddr, int *oval) \ > +{ \ > unsigned int loops = FUTEX_MAX_LOOPS; \ > + int ret, oldval, tmp; \ > \ > uaccess_enable_privileged(); \ > - asm volatile( \ > + asm volatile("// __llsc_futex_atomic_" #op "\n" \ > " prfm pstl1strm, %2\n" \ > "1: ldxr %w1, %2\n" \ > insn "\n" \ > @@ -35,45 +39,103 @@ do { > \ > : "r" (oparg), "Ir" (-EAGAIN) \ > : "memory"); \ > uaccess_disable_privileged(); \ > -} while (0) > + \ > + if (!ret) \ > + *oval = oldval; \ > + \ > + return ret; \ > +} > + > +LLSC_FUTEX_ATOMIC_OP(add, "add %w3, %w1, %w5") > +LLSC_FUTEX_ATOMIC_OP(or, "orr %w3, %w1, %w5") > +LLSC_FUTEX_ATOMIC_OP(and, "and %w3, %w1, %w5") > +LLSC_FUTEX_ATOMIC_OP(eor, "eor %w3, %w1, %w5") > +LLSC_FUTEX_ATOMIC_OP(set, "mov %w3, %w5")
Since you're reworking this code, how about we take the opportunity to use named arguments instead of the numbers? Will

