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

Reply via email to