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

Reply via email to