lkml.org 
[lkml]   [2022]   [Jun]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v2 01/42] KVM: selftests: Set KVM's supported CPUID as vCPU's CPUID during recreate
    From
    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>
    ---
    tools/testing/selftests/kvm/include/kvm_util_base.h | 9 +++++++++
    tools/testing/selftests/kvm/lib/kvm_util.c | 10 ++++++++--
    tools/testing/selftests/kvm/lib/x86_64/processor.c | 9 +++++++++
    tools/testing/selftests/kvm/x86_64/amx_test.c | 1 -
    tools/testing/selftests/kvm/x86_64/smm_test.c | 1 -
    tools/testing/selftests/kvm/x86_64/state_test.c | 1 -
    .../selftests/kvm/x86_64/vmx_preemption_timer_test.c | 2 --
    7 files changed, 26 insertions(+), 7 deletions(-)

    diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
    index cdaea2383543..1b9e8719c624 100644
    --- a/tools/testing/selftests/kvm/include/kvm_util_base.h
    +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
    @@ -681,6 +681,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)
    diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
    index 39f2f5f1338f..38c6083c9ce1 100644
    --- a/tools/testing/selftests/kvm/lib/kvm_util.c
    +++ b/tools/testing/selftests/kvm/lib/kvm_util.c
    @@ -392,11 +392,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);
    }

    /*
    @@ -1813,7 +1819,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;
    }
    diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c
    index 4a7de11d6f37..c46a22f8a9af 100644
    --- a/tools/testing/selftests/kvm/lib/x86_64/processor.c
    +++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c
    @@ -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
    *
    diff --git a/tools/testing/selftests/kvm/x86_64/amx_test.c b/tools/testing/selftests/kvm/x86_64/amx_test.c
    index dab4ca16a2df..95f59653dbce 100644
    --- a/tools/testing/selftests/kvm/x86_64/amx_test.c
    +++ b/tools/testing/selftests/kvm/x86_64/amx_test.c
    @@ -425,7 +425,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);
    diff --git a/tools/testing/selftests/kvm/x86_64/smm_test.c b/tools/testing/selftests/kvm/x86_64/smm_test.c
    index 3cd1da388b52..e89139ce68dd 100644
    --- a/tools/testing/selftests/kvm/x86_64/smm_test.c
    +++ b/tools/testing/selftests/kvm/x86_64/smm_test.c
    @@ -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);
    diff --git a/tools/testing/selftests/kvm/x86_64/state_test.c b/tools/testing/selftests/kvm/x86_64/state_test.c
    index 0bcd78cf7c79..ea878c963065 100644
    --- a/tools/testing/selftests/kvm/x86_64/state_test.c
    +++ b/tools/testing/selftests/kvm/x86_64/state_test.c
    @@ -214,7 +214,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);
    diff --git a/tools/testing/selftests/kvm/x86_64/vmx_preemption_timer_test.c b/tools/testing/selftests/kvm/x86_64/vmx_preemption_timer_test.c
    index 99e57b0cc2c9..771b54b227d5 100644
    --- a/tools/testing/selftests/kvm/x86_64/vmx_preemption_timer_test.c
    +++ b/tools/testing/selftests/kvm/x86_64/vmx_preemption_timer_test.c
    @@ -237,8 +237,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);
    --
    2.36.1.476.g0c4daa206d-goog
    \
     
     \ /
      Last update: 2022-06-14 22:08    [W:3.844 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site