Hi Will,

> 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?

Okay. Let me try this.


--
Sincerely,
Yeoreum Yun

Reply via email to