KVM: arm64: Remove kvm_arch_vcpu_run_map_fp()
authorMark Rutland <mark.rutland@arm.com>
Thu, 19 Jun 2025 13:48:17 +0000 (14:48 +0100)
committerMarc Zyngier <maz@kernel.org>
Thu, 3 Jul 2025 09:39:24 +0000 (10:39 +0100)
Historically KVM hyp code saved the host's FPSIMD state into the hosts's
fpsimd_state memory, and so it was necessary to map this into the hyp
Stage-1 mappings before running a vCPU.

This is no longer necessary as of commits:

fbc7e61195e2 ("KVM: arm64: Unconditionally save+flush host FPSIMD/SVE/SME state")
8eca7f6d5100 ("KVM: arm64: Remove host FPSIMD saving for non-protected KVM")

Since those commits, we eagerly save the host's FPSIMD state before
calling into hyp to run a vCPU, and hyp code never reads nor writes the
host's fpsimd_state memory. There's no longer any need to map the host's
fpsimd_state memory into the hyp Stage-1, and kvm_arch_vcpu_run_map_fp()
is unnecessary but benign.

Remove kvm_arch_vcpu_run_map_fp(). Currently there is no code to perform
a corresponding unmap, and we never mapped the host's SVE or SME state
into the hyp Stage-1, so no other code needs to be removed.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Fuad Tabba <tabba@google.com>
Cc: Marc Zyngier <maz@kernel.org>
Cc: Mark Brown <broonie@kernel.org>
Cc: Oliver Upton <oliver.upton@linux.dev>
Cc: Will Deacon <will@kernel.org>
Cc: kvmarm@lists.linux.dev
Reviewed-by: Mark Brown <broonie@kernel.org>
Tested-by: Fuad Tabba <tabba@google.com>
Reviewed-by: Fuad Tabba <tabba@google.com>
Link: https://lore.kernel.org/r/20250619134817.4075340-1-mark.rutland@arm.com
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/include/asm/kvm_host.h
arch/arm64/kvm/arm.c
arch/arm64/kvm/fpsimd.c

index d27079968341c00ef98ffc47fb35d4737feef3af..3e41a880b062396b03c5dc8ce53f12163862aee3 100644 (file)
@@ -1480,7 +1480,6 @@ int kvm_vm_ioctl_get_reg_writable_masks(struct kvm *kvm,
                                        struct reg_mask_range *range);
 
 /* Guest/host FPSIMD coordination helpers */
-int kvm_arch_vcpu_run_map_fp(struct kvm_vcpu *vcpu);
 void kvm_arch_vcpu_load_fp(struct kvm_vcpu *vcpu);
 void kvm_arch_vcpu_ctxflush_fp(struct kvm_vcpu *vcpu);
 void kvm_arch_vcpu_ctxsync_fp(struct kvm_vcpu *vcpu);
index b223d21c063c31341b0442642cdcc2ae00af7af6..23dd3f3fc3ebf5cb8c03292aa28a373dc8f7478f 100644 (file)
@@ -825,10 +825,6 @@ int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu)
        if (!kvm_arm_vcpu_is_finalized(vcpu))
                return -EPERM;
 
-       ret = kvm_arch_vcpu_run_map_fp(vcpu);
-       if (ret)
-               return ret;
-
        if (likely(vcpu_has_run_once(vcpu)))
                return 0;
 
index 8f6c8f57c6b9c15041d170fcb394db371c07aeec..15e17aca1dec0eb16311593c0a283aa28976b817 100644 (file)
 #include <asm/kvm_mmu.h>
 #include <asm/sysreg.h>
 
-/*
- * Called on entry to KVM_RUN unless this vcpu previously ran at least
- * once and the most recent prior KVM_RUN for this vcpu was called from
- * the same task as current (highly likely).
- *
- * This is guaranteed to execute before kvm_arch_vcpu_load_fp(vcpu),
- * such that on entering hyp the relevant parts of current are already
- * mapped.
- */
-int kvm_arch_vcpu_run_map_fp(struct kvm_vcpu *vcpu)
-{
-       struct user_fpsimd_state *fpsimd = &current->thread.uw.fpsimd_state;
-       int ret;
-
-       /* pKVM has its own tracking of the host fpsimd state. */
-       if (is_protected_kvm_enabled())
-               return 0;
-
-       /* Make sure the host task fpsimd state is visible to hyp: */
-       ret = kvm_share_hyp(fpsimd, fpsimd + 1);
-       if (ret)
-               return ret;
-
-       return 0;
-}
-
 /*
  * Prepare vcpu for saving the host's FPSIMD state and loading the guest's.
  * The actual loading is done by the FPSIMD access trap taken to hyp.