On Mon, Aug 03, 2026 at 11:56:49PM +0800, 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.
>

Reviewed-by: Yuan Yao <[email protected]>

> Signed-off-by: Mark Brown <[email protected]>
> ---
>  arch/arm64/kvm/hyp/nvhe/switch.c   | 13 +++++++++++++
>  arch/arm64/kvm/hyp/vhe/sysreg-sr.c | 14 ++++++++++++++
>  2 files changed, 27 insertions(+)
>
> diff --git a/arch/arm64/kvm/hyp/nvhe/switch.c 
> b/arch/arm64/kvm/hyp/nvhe/switch.c
> index 7318e3e6a5f3..fe8727bf2833 100644
> --- a/arch/arm64/kvm/hyp/nvhe/switch.c
> +++ b/arch/arm64/kvm/hyp/nvhe/switch.c
> @@ -301,6 +301,12 @@ int __kvm_vcpu_run(struct kvm_vcpu *vcpu)
>        */
>       dsb(nsh);
>
> +     /*
> +      * Ensure any GCS memory effects are visible to this CPU.
> +      */
> +     if (ctxt_has_gcs(guest_ctxt))
> +             gcsb_dsync();
> +
>       __kvm_adjust_pc(vcpu);
>
>       /*
> @@ -345,6 +351,13 @@ int __kvm_vcpu_run(struct kvm_vcpu *vcpu)
>        */
>       dsb(nsh);
>
> +     /*
> +      * Ensure any GCS memory effects from the outgoing vCPU are
> +      * visible elsewhere.
> +      */
> +     if (ctxt_has_gcs(guest_ctxt))
> +             gcsb_dsync();
> +
>       __deactivate_traps(vcpu);
>       __load_host_stage2();
>
> diff --git a/arch/arm64/kvm/hyp/vhe/sysreg-sr.c 
> b/arch/arm64/kvm/hyp/vhe/sysreg-sr.c
> index 2431c18f5792..4594992b008c 100644
> --- a/arch/arm64/kvm/hyp/vhe/sysreg-sr.c
> +++ b/arch/arm64/kvm/hyp/vhe/sysreg-sr.c
> @@ -239,6 +239,13 @@ void __vcpu_load_switch_sysregs(struct kvm_vcpu *vcpu)
>       if (vcpu_has_nv(vcpu))
>               dsb(nsh);
>
> +     /*
> +      * Ensure any GCS memory effects are visible to the incoming
> +      * vCPU.
> +      */
> +     if (ctxt_has_gcs(guest_ctxt))
> +             gcsb_dsync();
> +
>       /*
>        * Load guest EL1 and user state
>        *
> @@ -299,5 +306,12 @@ void __vcpu_put_switch_sysregs(struct kvm_vcpu *vcpu)
>       /* Restore host user state */
>       __sysreg_restore_user_state(host_ctxt);
>
> +     /*
> +      * Ensure any GCS memory effects from the outgoing vCPU are
> +      * visible elsewhere.
> +      */
> +     if (ctxt_has_gcs(guest_ctxt))
> +             gcsb_dsync();
> +
>       vcpu_clear_flag(vcpu, SYSREGS_ON_CPU);
>  }
>
> --
> 2.47.3
>

Reply via email to