OSDN Git Service

KVM: arm64: Move SVE state mapping at HYP to finalize-time
authorMarc Zyngier <maz@kernel.org>
Thu, 14 Oct 2021 09:24:48 +0000 (10:24 +0100)
committerMarc Zyngier <maz@kernel.org>
Wed, 1 Dec 2021 11:51:20 +0000 (11:51 +0000)
We currently map the SVE state to HYP on detection of a PID change.
Although this matches what we do for FPSIMD, this is pretty pointless
for SVE, as the buffer is per-vcpu and has nothing to do with the
thread that is being run.

Move the mapping of the SVE state to finalize-time, which is where
we allocate the state memory, and thus the most logical place to
do this.

Reviewed-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/fpsimd.c
arch/arm64/kvm/reset.c

index 5621020..62c0d78 100644 (file)
@@ -43,17 +43,6 @@ int kvm_arch_vcpu_run_map_fp(struct kvm_vcpu *vcpu)
        if (ret)
                goto error;
 
-       if (vcpu->arch.sve_state) {
-               void *sve_end;
-
-               sve_end = vcpu->arch.sve_state + vcpu_sve_state_size(vcpu);
-
-               ret = create_hyp_mappings(vcpu->arch.sve_state, sve_end,
-                                         PAGE_HYP);
-               if (ret)
-                       goto error;
-       }
-
        vcpu->arch.host_thread_info = kern_hyp_va(ti);
        vcpu->arch.host_fpsimd_state = kern_hyp_va(fpsimd);
 error:
index 426bd7f..c7a0249 100644 (file)
@@ -94,6 +94,8 @@ static int kvm_vcpu_finalize_sve(struct kvm_vcpu *vcpu)
 {
        void *buf;
        unsigned int vl;
+       size_t reg_sz;
+       int ret;
 
        vl = vcpu->arch.sve_max_vl;
 
@@ -106,10 +108,17 @@ static int kvm_vcpu_finalize_sve(struct kvm_vcpu *vcpu)
                    vl > SVE_VL_ARCH_MAX))
                return -EIO;
 
-       buf = kzalloc(SVE_SIG_REGS_SIZE(sve_vq_from_vl(vl)), GFP_KERNEL_ACCOUNT);
+       reg_sz = vcpu_sve_state_size(vcpu);
+       buf = kzalloc(reg_sz, GFP_KERNEL_ACCOUNT);
        if (!buf)
                return -ENOMEM;
 
+       ret = create_hyp_mappings(buf, buf + reg_sz, PAGE_HYP);
+       if (ret) {
+               kfree(buf);
+               return ret;
+       }
+       
        vcpu->arch.sve_state = buf;
        vcpu->arch.flags |= KVM_ARM64_VCPU_SVE_FINALIZED;
        return 0;