From: Marc Zyngier <maz@kernel.org>
To: Oliver Upton <oupton@kernel.org>
Cc: kvmarm@lists.linux.dev, Joey Gouly <joey.gouly@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Zenghui Yu <yuzenghui@huawei.com>
Subject: Re: [PATCH 09/12] KVM: arm64: Add helper for swapping guest descriptor
Date: Mon, 17 Nov 2025 14:14:00 +0000 [thread overview]
Message-ID: <86zf8ksq53.wl-maz@kernel.org> (raw)
In-Reply-To: <20251112183406.2118981-10-oupton@kernel.org>
On Wed, 12 Nov 2025 18:34:03 +0000,
Oliver Upton <oupton@kernel.org> wrote:
>
> Implementing FEAT_HAFDBS in KVM's software PTWs requires the ability to
> CAS a descriptor to update the in-memory value. Add an accessor to do
> exactly that, coping with the fact that guest descriptors are in user
> memory (duh).
>
> While FEAT_LSE required on any system that implements NV, KVM now uses
> the stage-1 PTW for non-nested use cases meaning an LL/SC implementation
> is necessary as well.
>
> Signed-off-by: Oliver Upton <oupton@kernel.org>
> ---
> arch/arm64/include/asm/kvm_nested.h | 2 +
> arch/arm64/kvm/at.c | 86 +++++++++++++++++++++++++++++
> 2 files changed, 88 insertions(+)
>
> diff --git a/arch/arm64/include/asm/kvm_nested.h b/arch/arm64/include/asm/kvm_nested.h
> index 5d967b60414c..6dbc2908aed9 100644
> --- a/arch/arm64/include/asm/kvm_nested.h
> +++ b/arch/arm64/include/asm/kvm_nested.h
> @@ -403,4 +403,6 @@ void kvm_handle_s1e2_tlbi(struct kvm_vcpu *vcpu, u32 inst, u64 val);
> (FIX_VNCR - __c); \
> })
>
> +int __kvm_at_swap_desc(struct kvm *kvm, gpa_t ipa, u64 old, u64 new);
> +
> #endif /* __ARM64_KVM_NESTED_H */
> diff --git a/arch/arm64/kvm/at.c b/arch/arm64/kvm/at.c
> index a295a37dd3b1..74f3be46fa66 100644
> --- a/arch/arm64/kvm/at.c
> +++ b/arch/arm64/kvm/at.c
> @@ -1650,3 +1650,89 @@ int __kvm_find_s1_desc_level(struct kvm_vcpu *vcpu, u64 va, u64 ipa, int *level)
> return ret;
> }
> }
> +
> +static int __lse_swap_desc(u64 __user *ptep, u64 old, u64 new)
> +{
> + u64 tmp = old;
> + int ret = 0;
> +
> + uaccess_enable_privileged();
> +
> + asm volatile(__LSE_PREAMBLE
> + "1: cas %[old], %[new], %[addr]\n"
> + "2:\n"
> + _ASM_EXTABLE_UACCESS_ERR(1b, 2b, %w[ret])
> + : [old] "+r" (old), [addr] "+Q" (*ptep), [ret] "+r" (ret)
> + : [new] "r" (new)
> + : "memory");
> +
> + uaccess_disable_privileged();
> +
> + if (ret)
> + return ret;
> + if (tmp != old)
> + return -EAGAIN;
> +
> + return ret;
> +}
> +
> +static int __llsc_swap_desc(u64 __user *ptep, u64 old, u64 new)
> +{
> + unsigned int loops = 128;
> + u64 tmp;
> + int ret;
> +
> + uaccess_enable_privileged();
> +
> + asm volatile("prfm pstl1strm, %[addr]\n"
> + "1: ldxr %[tmp], %[addr]\n"
> + "sub %[tmp], %[tmp], %[old]\n"
> + "cbnz %[tmp], 3f\n"
> + "2: stlxr %w[ret], %[new], %[addr]\n"
> + "cbz %w[ret], 4f\n"
> + "sub %w[loops], %w[loops], #1\n"
> + "cbnz %w[loops], 1b\n"
> + "3: mov %w[ret], %w[eagain]\n"
> + "4:\n"
> + : [ret] "=r" (ret), [addr] "+Q" (*ptep), [tmp] "=&r" (tmp),
> + [loops] "+r" (loops)
> + : [old] "r" (old), [new] "r" (new), [eagain] "Ir" (-EAGAIN)
> + : "memory");
Why doesn't this need an exception table as well? I'd expect it to
fault just as much as the LSE version (and ret cannot report -EFAULT,
for example).
I'm also on the fence about the bounded loop. Yes, forward progress is
a problem, but it should only affect large systems which can readily
use the atomic instructions. I'd rather we get rid of it until proven
that we really need something like it.
Thanks,
M.
--
Without deviation from the norm, progress is not possible.
next prev parent reply other threads:[~2025-11-17 14:14 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-12 18:33 [PATCH 00/12] KVM: arm64: nv: Implement FEAT_XNX and FEAT_HAF Oliver Upton
2025-11-12 18:33 ` [PATCH 01/12] arm64: Detect FEAT_XNX Oliver Upton
2025-11-12 18:33 ` [PATCH 02/12] KVM: arm64: Add support for FEAT_XNX stage-2 permissions Oliver Upton
2025-11-12 18:33 ` [PATCH 03/12] KVM: arm64: nv: Forward FEAT_XNX permissions to the shadow stage-2 Oliver Upton
2025-11-12 18:33 ` [PATCH 04/12] KVM: arm64: Teach ptdump about FEAT_XNX permissions Oliver Upton
2025-11-12 18:33 ` [PATCH 05/12] KVM: arm64: nv: Advertise support for FEAT_XNX Oliver Upton
2025-11-12 18:34 ` [PATCH 06/12] KVM: arm64: Call helper for reading descriptors directly Oliver Upton
2025-11-12 18:34 ` [PATCH 07/12] KVM: arm64: Handle endianness in read helper for emulated PTW Oliver Upton
2025-11-12 18:34 ` [PATCH 08/12] KVM: arm64: nv: Use pgtable definitions in stage-2 walk Oliver Upton
2025-11-12 18:34 ` [PATCH 09/12] KVM: arm64: Add helper for swapping guest descriptor Oliver Upton
2025-11-17 14:14 ` Marc Zyngier [this message]
2025-11-17 18:13 ` Oliver Upton
2025-11-12 18:34 ` [PATCH 10/12] KVM: arm64: Implement HW access flag management in stage-1 SW PTW Oliver Upton
2025-11-17 14:49 ` Marc Zyngier
2025-11-17 17:53 ` Oliver Upton
2025-11-12 18:34 ` [PATCH 11/12] KVM: arm64: nv: Implement HW access flag management in stage-2 " Oliver Upton
2025-11-17 14:51 ` Marc Zyngier
2025-11-12 18:34 ` [PATCH 12/12] KVM: arm64: nv: Expose hardware access flag management to NV guests Oliver Upton
2025-11-17 15:21 ` [PATCH 00/12] KVM: arm64: nv: Implement FEAT_XNX and FEAT_HAF Marc Zyngier
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=86zf8ksq53.wl-maz@kernel.org \
--to=maz@kernel.org \
--cc=joey.gouly@arm.com \
--cc=kvmarm@lists.linux.dev \
--cc=oupton@kernel.org \
--cc=suzuki.poulose@arm.com \
--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.