Commit 4c16fa3e authored by Sean Christopherson's avatar Sean Christopherson

KVM: selftests: Set KVM's supported CPUID as vCPU's CPUID during recreate

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: default avatarSean Christopherson <seanjc@google.com>
Link: https://lore.kernel.org/r/20220614200707.3315957-2-seanjc@google.com
parent 594a1c27
...@@ -739,6 +739,15 @@ static inline struct kvm_vcpu *vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id, ...@@ -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); 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); void virt_arch_pgd_alloc(struct kvm_vm *vm);
static inline void virt_pgd_alloc(struct kvm_vm *vm) static inline void virt_pgd_alloc(struct kvm_vm *vm)
......
...@@ -388,11 +388,17 @@ void kvm_vm_restart(struct kvm_vm *vmp) ...@@ -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) struct kvm_vcpu *vm_recreate_with_one_vcpu(struct kvm_vm *vm)
{ {
kvm_vm_restart(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) ...@@ -1812,7 +1818,7 @@ void *addr_gva2hva(struct kvm_vm *vm, vm_vaddr_t gva)
return addr_gpa2hva(vm, addr_gva2gpa(vm, 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; return ((1ULL << vm->pa_bits) >> vm->page_shift) - 1;
} }
......
...@@ -663,6 +663,15 @@ struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id, ...@@ -663,6 +663,15 @@ struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
return vcpu; 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 * Allocate an instance of struct kvm_cpuid2
* *
......
...@@ -424,7 +424,6 @@ int main(int argc, char *argv[]) ...@@ -424,7 +424,6 @@ int main(int argc, char *argv[])
/* Restore state in a new VM. */ /* Restore state in a new VM. */
vcpu = vm_recreate_with_one_vcpu(vm); vcpu = vm_recreate_with_one_vcpu(vm);
vcpu_set_cpuid(vcpu, kvm_get_supported_cpuid());
vcpu_load_state(vcpu, state); vcpu_load_state(vcpu, state);
run = vcpu->run; run = vcpu->run;
kvm_x86_state_cleanup(state); kvm_x86_state_cleanup(state);
......
...@@ -205,7 +205,6 @@ int main(int argc, char *argv[]) ...@@ -205,7 +205,6 @@ int main(int argc, char *argv[])
kvm_vm_release(vm); kvm_vm_release(vm);
vcpu = vm_recreate_with_one_vcpu(vm); vcpu = vm_recreate_with_one_vcpu(vm);
vcpu_set_cpuid(vcpu, kvm_get_supported_cpuid());
vcpu_load_state(vcpu, state); vcpu_load_state(vcpu, state);
run = vcpu->run; run = vcpu->run;
kvm_x86_state_cleanup(state); kvm_x86_state_cleanup(state);
......
...@@ -213,7 +213,6 @@ int main(int argc, char *argv[]) ...@@ -213,7 +213,6 @@ int main(int argc, char *argv[])
/* Restore state in a new VM. */ /* Restore state in a new VM. */
vcpu = vm_recreate_with_one_vcpu(vm); vcpu = vm_recreate_with_one_vcpu(vm);
vcpu_set_cpuid(vcpu, kvm_get_supported_cpuid());
vcpu_load_state(vcpu, state); vcpu_load_state(vcpu, state);
run = vcpu->run; run = vcpu->run;
kvm_x86_state_cleanup(state); kvm_x86_state_cleanup(state);
......
...@@ -236,8 +236,6 @@ int main(int argc, char *argv[]) ...@@ -236,8 +236,6 @@ int main(int argc, char *argv[])
/* Restore state in a new VM. */ /* Restore state in a new VM. */
vcpu = vm_recreate_with_one_vcpu(vm); vcpu = vm_recreate_with_one_vcpu(vm);
vcpu_set_cpuid(vcpu, kvm_get_supported_cpuid());
vcpu_load_state(vcpu, state); vcpu_load_state(vcpu, state);
run = vcpu->run; run = vcpu->run;
kvm_x86_state_cleanup(state); kvm_x86_state_cleanup(state);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment