KVM: arm64: Merge kvm_arch_vcpu_run_pid_change() and kvm_vcpu_first_run_init()
authorMarc Zyngier <maz@kernel.org>
Thu, 14 Oct 2021 10:42:38 +0000 (11:42 +0100)
committerMarc Zyngier <maz@kernel.org>
Wed, 1 Dec 2021 11:51:21 +0000 (11:51 +0000)
The kvm_arch_vcpu_run_pid_change() helper gets called on each PID
change. The kvm_vcpu_first_run_init() helper gets run on the...
first run(!) of a vcpu.

As it turns out, the first run of a vcpu also triggers a PID change
event (vcpu->pid is initially NULL).

Use this property to merge these two helpers and get rid of another
arm64-specific oddity.

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

index b30b05a..f20a265 100644 (file)
@@ -584,22 +584,34 @@ static void update_vmid(struct kvm_vmid *vmid)
        spin_unlock(&kvm_vmid_lock);
 }
 
-int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu)
+static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu)
 {
-       return kvm_arch_vcpu_run_map_fp(vcpu);
+       return vcpu->arch.target >= 0;
 }
 
-static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu)
+/*
+ * Handle both the initialisation that is being done when the vcpu is
+ * run for the first time, as well as the updates that must be
+ * performed each time we get a new thread dealing with this vcpu.
+ */
+int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu)
 {
        struct kvm *kvm = vcpu->kvm;
-       int ret = 0;
+       int ret;
 
-       if (likely(vcpu->arch.has_run_once))
-               return 0;
+       if (!kvm_vcpu_initialized(vcpu))
+               return -ENOEXEC;
 
        if (!kvm_arm_vcpu_is_finalized(vcpu))
                return -EPERM;
 
+       ret = kvm_arch_vcpu_run_map_fp(vcpu);
+       if (ret)
+               return ret;
+
+       if (likely(vcpu->arch.has_run_once))
+               return 0;
+
        kvm_arm_vcpu_init_debug(vcpu);
 
        if (likely(irqchip_in_kernel(kvm))) {
@@ -688,11 +700,6 @@ static void vcpu_req_sleep(struct kvm_vcpu *vcpu)
        smp_rmb();
 }
 
-static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu)
-{
-       return vcpu->arch.target >= 0;
-}
-
 static void check_vcpu_requests(struct kvm_vcpu *vcpu)
 {
        if (kvm_request_pending(vcpu)) {
@@ -788,13 +795,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
        struct kvm_run *run = vcpu->run;
        int ret;
 
-       if (unlikely(!kvm_vcpu_initialized(vcpu)))
-               return -ENOEXEC;
-
-       ret = kvm_vcpu_first_run_init(vcpu);
-       if (ret)
-               return ret;
-
        if (run->exit_reason == KVM_EXIT_MMIO) {
                ret = kvm_handle_mmio_return(vcpu);
                if (ret)