KVM: selftests: Set KVM's supported CPUID as vCPU's CPUID during recreate
authorSean Christopherson <seanjc@google.com>
Tue, 14 Jun 2022 20:06:26 +0000 (20:06 +0000)
committerSean Christopherson <seanjc@google.com>
Thu, 14 Jul 2022 01:14:08 +0000 (18:14 -0700)
On x86-64, set KVM's supported CPUID as the vCPU's CPUID when recreating
a VM+vCPU to deduplicate code for state save/restore tests, and to
provide symmetry of sorts with respect to vm_create_with_one_vcpu().  The
extra KVM_SET_CPUID2 call is wasteful for Hyper-V, but ultimately is
nothing more than an expensive nop, and overriding the vCPU's CPUID with
the Hyper-V CPUID information is the only known scenario where a state
save/restore test wouldn't need/want the default CPUID.

Opportunistically use __weak for the default vm_compute_max_gfn(), it's
provided by tools' compiler.h.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Link: https://lore.kernel.org/r/20220614200707.3315957-2-seanjc@google.com
tools/testing/selftests/kvm/include/kvm_util_base.h
tools/testing/selftests/kvm/lib/kvm_util.c
tools/testing/selftests/kvm/lib/x86_64/processor.c
tools/testing/selftests/kvm/x86_64/amx_test.c
tools/testing/selftests/kvm/x86_64/smm_test.c
tools/testing/selftests/kvm/x86_64/state_test.c
tools/testing/selftests/kvm/x86_64/vmx_preemption_timer_test.c

index b78e3c7..19f7b33 100644 (file)
@@ -739,6 +739,15 @@ static inline struct kvm_vcpu *vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
        return vm_arch_vcpu_add(vm, vcpu_id, guest_code);
 }
 
+/* Re-create a vCPU after restarting a VM, e.g. for state save/restore tests. */
+struct kvm_vcpu *vm_arch_vcpu_recreate(struct kvm_vm *vm, uint32_t vcpu_id);
+
+static inline struct kvm_vcpu *vm_vcpu_recreate(struct kvm_vm *vm,
+                                               uint32_t vcpu_id)
+{
+       return vm_arch_vcpu_recreate(vm, vcpu_id);
+}
+
 void virt_arch_pgd_alloc(struct kvm_vm *vm);
 
 static inline void virt_pgd_alloc(struct kvm_vm *vm)
index 768f3bc..49c1898 100644 (file)
@@ -388,11 +388,17 @@ void kvm_vm_restart(struct kvm_vm *vmp)
        }
 }
 
+__weak struct kvm_vcpu *vm_arch_vcpu_recreate(struct kvm_vm *vm,
+                                             uint32_t vcpu_id)
+{
+       return __vm_vcpu_add(vm, vcpu_id);
+}
+
 struct kvm_vcpu *vm_recreate_with_one_vcpu(struct kvm_vm *vm)
 {
        kvm_vm_restart(vm);
 
-       return __vm_vcpu_add(vm, 0);
+       return vm_vcpu_recreate(vm, 0);
 }
 
 /*
@@ -1812,7 +1818,7 @@ void *addr_gva2hva(struct kvm_vm *vm, vm_vaddr_t gva)
        return addr_gpa2hva(vm, addr_gva2gpa(vm, gva));
 }
 
-unsigned long __attribute__((weak)) vm_compute_max_gfn(struct kvm_vm *vm)
+unsigned long __weak vm_compute_max_gfn(struct kvm_vm *vm)
 {
        return ((1ULL << vm->pa_bits) >> vm->page_shift) - 1;
 }
index 1a32b1c..909ac12 100644 (file)
@@ -663,6 +663,15 @@ struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
        return vcpu;
 }
 
+struct kvm_vcpu *vm_arch_vcpu_recreate(struct kvm_vm *vm, uint32_t vcpu_id)
+{
+       struct kvm_vcpu *vcpu = __vm_vcpu_add(vm, vcpu_id);
+
+       vcpu_set_cpuid(vcpu, kvm_get_supported_cpuid());
+
+       return vcpu;
+}
+
 /*
  * Allocate an instance of struct kvm_cpuid2
  *
index b71763b..4c59923 100644 (file)
@@ -424,7 +424,6 @@ int main(int argc, char *argv[])
 
                /* Restore state in a new VM.  */
                vcpu = vm_recreate_with_one_vcpu(vm);
-               vcpu_set_cpuid(vcpu, kvm_get_supported_cpuid());
                vcpu_load_state(vcpu, state);
                run = vcpu->run;
                kvm_x86_state_cleanup(state);
index 921cbf1..d29aefb 100644 (file)
@@ -205,7 +205,6 @@ int main(int argc, char *argv[])
                kvm_vm_release(vm);
 
                vcpu = vm_recreate_with_one_vcpu(vm);
-               vcpu_set_cpuid(vcpu, kvm_get_supported_cpuid());
                vcpu_load_state(vcpu, state);
                run = vcpu->run;
                kvm_x86_state_cleanup(state);
index 2b0de15..3f1a13f 100644 (file)
@@ -213,7 +213,6 @@ int main(int argc, char *argv[])
 
                /* Restore state in a new VM.  */
                vcpu = vm_recreate_with_one_vcpu(vm);
-               vcpu_set_cpuid(vcpu, kvm_get_supported_cpuid());
                vcpu_load_state(vcpu, state);
                run = vcpu->run;
                kvm_x86_state_cleanup(state);
index 0a8e989..8504c6c 100644 (file)
@@ -236,8 +236,6 @@ int main(int argc, char *argv[])
 
                /* Restore state in a new VM.  */
                vcpu = vm_recreate_with_one_vcpu(vm);
-
-               vcpu_set_cpuid(vcpu, kvm_get_supported_cpuid());
                vcpu_load_state(vcpu, state);
                run = vcpu->run;
                kvm_x86_state_cleanup(state);