diff --git a/arch/arm64/kvm/hyp/nvhe/pkvm.c b/arch/arm64/kvm/hyp/nvhe/pkvm.c index 1ff4677ca07a..73347743261e 100644 --- a/arch/arm64/kvm/hyp/nvhe/pkvm.c +++ b/arch/arm64/kvm/hyp/nvhe/pkvm.c @@ -389,7 +389,11 @@ struct pkvm_hyp_vcpu *pkvm_load_hyp_vcpu(pkvm_handle_t handle, if (!hyp_vm || hyp_vm->is_dying || hyp_vm->kvm.created_vcpus <= vcpu_idx) goto unlock; - hyp_vcpu = hyp_vm->vcpus[vcpu_idx]; + /* + * Synchronise with concurrent vCPU initialisation by relying on + * dependency ordering from the vCPU pointer. + */ + hyp_vcpu = READ_ONCE(hyp_vm->vcpus[vcpu_idx]); if (!hyp_vcpu) goto unlock; @@ -881,7 +885,11 @@ int __pkvm_init_vcpu(pkvm_handle_t handle, struct kvm_vcpu *host_vcpu) goto unlock_vcpus; } - hyp_vm->vcpus[idx] = hyp_vcpu; + /* + * Ensure the hyp_vcpu is initialised before publishing it to + * the vCPU-load path via 'hyp_vm->vcpus[]'. + */ + smp_store_release(&hyp_vm->vcpus[idx], hyp_vcpu); unlock_vcpus: hyp_spin_unlock(&hyp_vm->vcpus_lock);