From: Yeoreum Yun <yeoreum.yun@arm.com>
To: catalin.marinas@arm.com, will@kernel.org, broonie@kernel.org,
maz@kernel.org, oliver.upton@linux.dev, joey.gouly@arm.com,
james.morse@arm.com, ardb@kernel.org,
scott@os.amperecomputing.com, suzuki.poulose@arm.com,
yuzenghui@huawei.com, mark.rutland@arm.com
Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v8 5/5] arm64: futex: support futex with FEAT_LSUI
Date: Wed, 17 Sep 2025 13:57:33 +0100 [thread overview]
Message-ID: <aMqwPYb53L+OwRfw@e129823.arm.com> (raw)
In-Reply-To: <20250917110838.917281-6-yeoreum.yun@arm.com>
Hi,
> +LSUI_FUTEX_ATOMIC_OP(add, ldtadd, al)
> +LSUI_FUTEX_ATOMIC_OP(or, ldtset, al)
> +LSUI_FUTEX_ATOMIC_OP(andnot, ldtclr, al)
> +LSUI_FUTEX_ATOMIC_OP(set, swpt, al)
> +
> +static __always_inline int
> +__lsui_cmpxchg64(u64 __user *uaddr, u64 *oldval, u64 newval)
> +{
> + int ret = 0;
> +
> + asm volatile("// __lsui_cmpxchg64\n"
> + __LSUI_PREAMBLE
> +"1: casalt %x2, %x3, %1\n"
> +"2:\n"
> + _ASM_EXTABLE_UACCESS_ERR(1b, 2b, %w0)
> + : "+r" (ret), "+Q" (*uaddr), "+r" (*oldval)
> + : "r" (newval)
> + : "memory");
> +
> + return ret;
> +}
> +
> +static __always_inline int
> +__lsui_cmpxchg32(u32 __user *uaddr, u32 oldval, u32 newval, u32 *oval)
> +{
> + u64 __user *uaddr_al;
> + u64 oval64, nval64, tmp;
> + static const u64 hi_mask = IS_ENABLED(CONFIG_CPU_LITTLE_ENDIAN) ?
> + GENMASK_U64(63, 32): GENMASK_U64(31, 0);
> + static const u8 hi_shift = IS_ENABLED(CONFIG_CPU_LITTLE_ENDIAN) ? 32 : 0;
> + static const u8 lo_shift = IS_ENABLED(CONFIG_CPU_LITTLE_ENDIAN) ? 0 : 32;
> +
> + uaddr_al = (u64 __user *) PTR_ALIGN_DOWN(uaddr, sizeof(u64));
> + if (get_user(oval64, uaddr_al))
> + return -EFAULT;
> +
> + if ((u32 __user *)uaddr_al != uaddr) {
> + nval64 = ((oval64 & ~hi_mask) | ((u64)newval << hi_shift));
> + oval64 = ((oval64 & ~hi_mask) | ((u64)oldval << hi_shift));
> + } else {
> + nval64 = ((oval64 & hi_mask) | ((u64)newval << lo_shift));
> + oval64 = ((oval64 & hi_mask) | ((u64)oldval << lo_shift));
> + }
> +
> + tmp = oval64;
> +
> + if (__lsui_cmpxchg64(uaddr_al, &oval64, nval64))
> + return -EFAULT;
> +
> + if (tmp != oval64)
> + return -EAGAIN;
> +
> + *oval = oldval;
> +
> + return 0;
> +}
> +
While I see the code I couldn't erase some suspicion
because of below questions...:
1. Suppose there is structure:
struct s_test {
u32 futex;
u32 others;
};
Before CPU0 executing casalt futex, CPU1 executes the store32_rel() on
others. Then, Can CPU0 can observe the CPU1's store32_rel()
since casalt operates with &futex, but CPU1 operates with &others.
CPU0 CPU1
... store32_rel(&s_test->others);
/// can this see CPU1's modification?
casalt(..., ..., &s_test->futex);
2. Suppose there is structure:
struct s_test {
u32 others;
u32 futex;
};
Then, can below "ldtr" be reordered after casalt?
ldtr(&s_test->futex);
...
casalt(..., ..., &s_test->others);
I think the both cases can break the memory consistency unintensionaly
in the view of user...
Well, the dmb ish; could be solved the above problem before casalt,
However, It seems it's much better to return former ll/sc method...?
Thanks!
--
Sincerely,
Yeoreum Yun
next prev parent reply other threads:[~2025-09-17 12:58 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-17 11:08 [PATCH v8 0/5] support FEAT_LSUI and apply it on futex atomic ops Yeoreum Yun
2025-09-17 11:08 ` [PATCH v8 1/5] arm64: cpufeature: add FEAT_LSUI Yeoreum Yun
2025-09-17 11:08 ` [PATCH v8 2/5] KVM: arm64: expose FEAT_LSUI to guest Yeoreum Yun
2025-09-17 11:08 ` [PATCH v8 3/5] arm64: Kconfig: Detect toolchain support for LSUI Yeoreum Yun
2025-09-17 11:08 ` [PATCH v8 4/5] arm64: futex: refactor futex atomic operation Yeoreum Yun
2025-09-17 11:08 ` [PATCH v8 5/5] arm64: futex: support futex with FEAT_LSUI Yeoreum Yun
2025-09-17 12:57 ` Yeoreum Yun [this message]
2025-09-17 13:04 ` Mark Rutland
2025-09-17 13:35 ` Yeoreum Yun
2025-09-17 13:57 ` Mark Rutland
2025-09-17 14:07 ` Yeoreum Yun
2025-09-18 9:11 ` Yeoreum Yun
2025-09-17 13:42 ` Yeoreum Yun
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aMqwPYb53L+OwRfw@e129823.arm.com \
--to=yeoreum.yun@arm.com \
--cc=ardb@kernel.org \
--cc=broonie@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=james.morse@arm.com \
--cc=joey.gouly@arm.com \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=maz@kernel.org \
--cc=oliver.upton@linux.dev \
--cc=scott@os.amperecomputing.com \
--cc=suzuki.poulose@arm.com \
--cc=will@kernel.org \
--cc=yuzenghui@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.