mbox series

[v3,0/6] KVM: nVMX: Enlightened VMCS for Hyper-V on KVM

Message ID 20180725163057.13948-1-vkuznets@redhat.com (mailing list archive)
Headers show
Series KVM: nVMX: Enlightened VMCS for Hyper-V on KVM | expand

Message

Vitaly Kuznetsov July 25, 2018, 4:30 p.m. UTC
Changes since v2:
- Rebase to the current kvm/queue.
- Simplify clean fields check in prepare_vmcs02{,_full} and
  copy_enlightened_to_vmcs12() by resetting the clean fields mask in
  nested_vmx_handle_enlightened_vmptrld() when we switch from one L2 guest
  to another [Paolo Bonzini]
- Cope with the newly introduced vmx_get_nested_state() by returning
  -ENOTSUPP when eVMCS is in use. We'll do proper nested state save/restore
  later.

Description:

This is an initial implementation of Enlightened VMCS for nested Hyper-V on
KVM. Using it helps to spare 1500 cpu cycles for nested vmexit (tight cpuid
loop in WS2016 with Hyper-V role on KVM: 15200 cycles -> 13700 cycles).

Ladi Prosek (1):
  KVM: hyperv: define VP assist page helpers

Vitaly Kuznetsov (5):
  KVM: VMX: refactor evmcs_sanitize_exec_ctrls()
  KVM: nVMX: add KVM_CAP_HYPERV_ENLIGHTENED_VMCS capability
  KVM: nVMX: add enlightened VMCS state
  KVM: nVMX: implement enlightened VMPTRLD and VMCLEAR
  KVM: nVMX: optimize prepare_vmcs02{,_full} for Enlightened VMCS case

 arch/x86/include/asm/kvm_host.h |   3 +
 arch/x86/kvm/hyperv.c           |  23 +-
 arch/x86/kvm/hyperv.h           |   4 +
 arch/x86/kvm/lapic.c            |   4 +-
 arch/x86/kvm/lapic.h            |   2 +-
 arch/x86/kvm/svm.c              |   9 +
 arch/x86/kvm/vmx.c              | 824 +++++++++++++++++++++++++++++++++-------
 arch/x86/kvm/x86.c              |  17 +-
 include/uapi/linux/kvm.h        |   1 +
 9 files changed, 737 insertions(+), 150 deletions(-)

Comments

Paolo Bonzini Aug. 2, 2018, 12:45 p.m. UTC | #1
On 25/07/2018 18:30, Vitaly Kuznetsov wrote:
> Changes since v2:
> - Rebase to the current kvm/queue.
> - Simplify clean fields check in prepare_vmcs02{,_full} and
>   copy_enlightened_to_vmcs12() by resetting the clean fields mask in
>   nested_vmx_handle_enlightened_vmptrld() when we switch from one L2 guest
>   to another [Paolo Bonzini]
> - Cope with the newly introduced vmx_get_nested_state() by returning
>   -ENOTSUPP when eVMCS is in use. We'll do proper nested state save/restore
>   later.

Looks good, but we have to do something about live migration.  Perhaps
you can write a testcase analogous to the new state_test, that tests
eVMCS in general before we have support in QEMU.

Thanks,

Paolo

> Description:
> 
> This is an initial implementation of Enlightened VMCS for nested Hyper-V on
> KVM. Using it helps to spare 1500 cpu cycles for nested vmexit (tight cpuid
> loop in WS2016 with Hyper-V role on KVM: 15200 cycles -> 13700 cycles).
> 
> Ladi Prosek (1):
>   KVM: hyperv: define VP assist page helpers
> 
> Vitaly Kuznetsov (5):
>   KVM: VMX: refactor evmcs_sanitize_exec_ctrls()
>   KVM: nVMX: add KVM_CAP_HYPERV_ENLIGHTENED_VMCS capability
>   KVM: nVMX: add enlightened VMCS state
>   KVM: nVMX: implement enlightened VMPTRLD and VMCLEAR
>   KVM: nVMX: optimize prepare_vmcs02{,_full} for Enlightened VMCS case
> 
>  arch/x86/include/asm/kvm_host.h |   3 +
>  arch/x86/kvm/hyperv.c           |  23 +-
>  arch/x86/kvm/hyperv.h           |   4 +
>  arch/x86/kvm/lapic.c            |   4 +-
>  arch/x86/kvm/lapic.h            |   2 +-
>  arch/x86/kvm/svm.c              |   9 +
>  arch/x86/kvm/vmx.c              | 824 +++++++++++++++++++++++++++++++++-------
>  arch/x86/kvm/x86.c              |  17 +-
>  include/uapi/linux/kvm.h        |   1 +
>  9 files changed, 737 insertions(+), 150 deletions(-)
>
Vitaly Kuznetsov Aug. 2, 2018, 1:22 p.m. UTC | #2
Paolo Bonzini <pbonzini@redhat.com> writes:

> On 25/07/2018 18:30, Vitaly Kuznetsov wrote:
>> Changes since v2:
>> - Rebase to the current kvm/queue.
>> - Simplify clean fields check in prepare_vmcs02{,_full} and
>>   copy_enlightened_to_vmcs12() by resetting the clean fields mask in
>>   nested_vmx_handle_enlightened_vmptrld() when we switch from one L2 guest
>>   to another [Paolo Bonzini]
>> - Cope with the newly introduced vmx_get_nested_state() by returning
>>   -ENOTSUPP when eVMCS is in use. We'll do proper nested state save/restore
>>   later.
>
> Looks good, but we have to do something about live migration.

Sure,

I don't actually see any fundumental problems when eVMCS is in use,
however, I'd like to enable migration when we know that it works so I
was going to wait for your nested virtualization state migration series
to land and gain Qemu support before starting to experiment. "One bite
at a time".

> Perhaps you can write a testcase analogous to the new state_test, that
> tests eVMCS in general before we have support in QEMU.

I'll take a look, thanks for the pointer!
Paolo Bonzini Aug. 2, 2018, 1:26 p.m. UTC | #3
On 02/08/2018 15:22, Vitaly Kuznetsov wrote:
>> Looks good, but we have to do something about live migration.
> Sure,
> 
> I don't actually see any fundumental problems when eVMCS is in use,
> however, I'd like to enable migration when we know that it works so I
> was going to wait for your nested virtualization state migration series
> to land and gain Qemu support before starting to experiment. "One bite
> at a time".
> 

Don't worry about QEMU - working with tools/testing/selftests/kvm/ is
much simpler (as long as a similar test exists to what you're doing).

Paolo
Paolo Bonzini Aug. 2, 2018, 5:25 p.m. UTC | #4
Just make clean and it will work. Will debug it.

Paolo

----- Paolo Bonzini <pbonzini@redhat.com> ha scritto:
> On 02/08/2018 15:22, Vitaly Kuznetsov wrote:
> >> Looks good, but we have to do something about live migration.
> > Sure,
> > 
> > I don't actually see any fundumental problems when eVMCS is in use,
> > however, I'd like to enable migration when we know that it works so I
> > was going to wait for your nested virtualization state migration series
> > to land and gain Qemu support before starting to experiment. "One bite
> > at a time".
> > 
> 
> Don't worry about QEMU - working with tools/testing/selftests/kvm/ is
> much simpler (as long as a similar test exists to what you're doing).
> 
> Paolo