On Tue, Sep 01, 2026 at 10:47:02PM +0100, Mark Brown wrote:
> In order to allow efficient implementation of GCS implementations are
> permitted to do GCS specific caching, with barriers implicit in stack
> switch operations and GCSB DSYNC as an explicit barrier. Since we do
> not use GCS in the hypervisor or host kernel the hypervisor cannot rely
> on any barriers being present in vCPU context switches other than those
> it explicitly inserts. Add explicit barriers when loading and saving
> vCPU state.
>
> Signed-off-by: Mark Brown <[email protected]>
> Reviewed-by: Yuan Yao <[email protected]>
> ---
> arch/arm64/kvm/arm.c | 7 +++++++
> arch/arm64/kvm/hyp/nvhe/hyp-main.c | 7 +++++++
> 2 files changed, 14 insertions(+)
>
> diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
> index 8b080804bc90..52f53f682e6a 100644
> --- a/arch/arm64/kvm/arm.c
> +++ b/arch/arm64/kvm/arm.c
> @@ -755,6 +755,13 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
> vcpu_set_flag(vcpu, PKVM_HOST_STATE_DIRTY);
> }
>
> + /*
> + * Ensure any GCS memory effects from the outgoing vCPU are
> + * visible elsewhere.
> + */
> + if (kvm_has_gcs(vcpu->kvm))
> + gcsb_dsync();
> +
Makes sense as previously discussed:
Only gcsb when leaving the guest, if it's possible the vcpu will be
migrated somewhere else.
> kvm_vcpu_put_debug(vcpu);
> kvm_arch_vcpu_put_fp(vcpu);
> if (has_vhe())
> diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-main.c
> b/arch/arm64/kvm/hyp/nvhe/hyp-main.c
> index 9a3b92e626ad..534db037c5f6 100644
> --- a/arch/arm64/kvm/hyp/nvhe/hyp-main.c
> +++ b/arch/arm64/kvm/hyp/nvhe/hyp-main.c
> @@ -261,6 +261,13 @@ static void sync_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vcpu)
> fpsimd_sve_sync(&hyp_vcpu->vcpu);
> sync_debug_state(hyp_vcpu);
>
> + /*
> + * Ensure any GCS memory effects from the outgoing vCPU are
> + * visible elsewhere even if the host skips syncing.
> + */
> + if (kvm_has_gcs(hyp_vcpu->vcpu.kvm))
> + gcsb_dsync();
> +
> if (pkvm_hyp_vcpu_is_protected(hyp_vcpu)) {
> host_vcpu->arch.ctxt = hyp_vcpu->vcpu.arch.ctxt;
> } else {
>
sync_hyp_vcpu() gets called only in handle___kvm_vcpu_run(), just after
__kvm_vcpu_run(), and outside of the main loop. So it makes sense to gcsb
here.
FWIW:
Reviewed-by: Leonardo Bras <[email protected]>
Thanks!
Leo