KVM: arm64: Drop vcpu->arch.has_run_once for vcpu->pid
authorMarc Zyngier <maz@kernel.org>
Thu, 14 Oct 2021 11:13:06 +0000 (12:13 +0100)
committerMarc Zyngier <maz@kernel.org>
Wed, 1 Dec 2021 11:51:22 +0000 (11:51 +0000)
With the transition to kvm_arch_vcpu_run_pid_change() to handle
the "run once" activities, it becomes obvious that has_run_once
is now an exact shadow of vcpu->pid.

Replace vcpu->arch.has_run_once with a new vcpu_has_run_once()
helper that directly checks for vcpu->pid, and get rid of the
now unused field.

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

index f464e15..cbb5ff8 100644 (file)
@@ -367,9 +367,6 @@ struct kvm_vcpu_arch {
        int target;
        DECLARE_BITMAP(features, KVM_VCPU_MAX_FEATURES);
 
-       /* Detect first run of a vcpu */
-       bool has_run_once;
-
        /* Virtual SError ESR to restore when HCR_EL2.VSE is set */
        u64 vsesr_el2;
 
@@ -606,6 +603,8 @@ int __kvm_arm_vcpu_set_events(struct kvm_vcpu *vcpu,
 void kvm_arm_halt_guest(struct kvm *kvm);
 void kvm_arm_resume_guest(struct kvm *kvm);
 
+#define vcpu_has_run_once(vcpu)        !!rcu_access_pointer((vcpu)->pid)
+
 #ifndef __KVM_NVHE_HYPERVISOR__
 #define kvm_call_hyp_nvhe(f, ...)                                              \
        ({                                                              \
index f20a265..c79d8e5 100644 (file)
@@ -351,7 +351,7 @@ void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)
 
 void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
 {
-       if (vcpu->arch.has_run_once && unlikely(!irqchip_in_kernel(vcpu->kvm)))
+       if (vcpu_has_run_once(vcpu) && unlikely(!irqchip_in_kernel(vcpu->kvm)))
                static_branch_dec(&userspace_irqchip_in_use);
 
        kvm_mmu_free_memory_cache(&vcpu->arch.mmu_page_cache);
@@ -609,7 +609,7 @@ int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu)
        if (ret)
                return ret;
 
-       if (likely(vcpu->arch.has_run_once))
+       if (likely(vcpu_has_run_once(vcpu)))
                return 0;
 
        kvm_arm_vcpu_init_debug(vcpu);
@@ -640,8 +640,6 @@ int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu)
                static_branch_inc(&userspace_irqchip_in_use);
        }
 
-       vcpu->arch.has_run_once = true;
-
        /*
         * Initialize traps for protected VMs.
         * NOTE: Move to run in EL2 directly, rather than via a hypercall, once
@@ -1132,7 +1130,7 @@ static int kvm_arch_vcpu_ioctl_vcpu_init(struct kvm_vcpu *vcpu,
         * need to invalidate the I-cache though, as FWB does *not*
         * imply CTR_EL0.DIC.
         */
-       if (vcpu->arch.has_run_once) {
+       if (vcpu_has_run_once(vcpu)) {
                if (!cpus_have_final_cap(ARM64_HAS_STAGE2_FWB))
                        stage2_unmap_vm(vcpu->kvm);
                else
index 0a06d06..ce2b42c 100644 (file)
@@ -91,7 +91,7 @@ int kvm_vgic_create(struct kvm *kvm, u32 type)
                return ret;
 
        kvm_for_each_vcpu(i, vcpu, kvm) {
-               if (vcpu->arch.has_run_once)
+               if (vcpu_has_run_once(vcpu))
                        goto out_unlock;
        }
        ret = 0;