Re: [PATCH v3 00/12] KVM: Implement nested TSC scaling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 21/05/21 12:24, Ilias Stamatis wrote:
KVM currently supports hardware-assisted TSC scaling but only for L1;
the feature is not exposed to nested guests. This patch series adds
support for nested TSC scaling and allows both L1 and L2 to be scaled
with different scaling factors. That is achieved by "merging" the 01 and
02 values together.

Most of the logic in this series is implemented in common code (by doing
the necessary restructurings), however the patches add support for VMX
only. Adding support for SVM should be easy at this point and Maxim
Levitsky has volunteered to do this (thanks!).

Changelog:
v3:
   - Applied Sean's feedback
   - Refactored patches 7 to 10

v2:
   - Applied all of Maxim's feedback
   - Added a mul_s64_u64_shr function in math64.h
   - Added a separate kvm_scale_tsc_l1 function instead of passing an
     argument to kvm_scale_tsc
   - Implemented the 02 fields calculations in common code
   - Moved all of write_l1_tsc_offset's logic to common code
   - Added a check for whether the TSC is stable in patch 10
   - Used a random L1 factor and a negative offset in patch 10

Ilias Stamatis (12):
   math64.h: Add mul_s64_u64_shr()
   KVM: X86: Store L1's TSC scaling ratio in 'struct kvm_vcpu_arch'
   KVM: X86: Rename kvm_compute_tsc_offset() to
     kvm_compute_tsc_offset_l1()
   KVM: X86: Add a ratio parameter to kvm_scale_tsc()
   KVM: VMX: Add a TSC multiplier field in VMCS12
   KVM: X86: Add functions for retrieving L2 TSC fields from common code
   KVM: X86: Add functions that calculate L2's TSC offset and multiplier
   KVM: X86: Move write_l1_tsc_offset() logic to common code and rename
     it
   KVM: VMX: Remove vmx->current_tsc_ratio and decache_tsc_multiplier()
   KVM: VMX: Set the TSC offset and multiplier on nested entry and exit
   KVM: VMX: Expose TSC scaling to L2
   KVM: selftests: x86: Add vmx_nested_tsc_scaling_test

  arch/x86/include/asm/kvm-x86-ops.h            |   4 +-
  arch/x86/include/asm/kvm_host.h               |  14 +-
  arch/x86/kvm/svm/svm.c                        |  29 ++-
  arch/x86/kvm/vmx/nested.c                     |  33 ++-
  arch/x86/kvm/vmx/vmcs12.c                     |   1 +
  arch/x86/kvm/vmx/vmcs12.h                     |   4 +-
  arch/x86/kvm/vmx/vmx.c                        |  49 ++--
  arch/x86/kvm/vmx/vmx.h                        |  11 +-
  arch/x86/kvm/x86.c                            |  91 +++++--
  include/linux/math64.h                        |  19 ++
  tools/testing/selftests/kvm/.gitignore        |   1 +
  tools/testing/selftests/kvm/Makefile          |   1 +
  .../kvm/x86_64/vmx_nested_tsc_scaling_test.c  | 242 ++++++++++++++++++
  13 files changed, 417 insertions(+), 82 deletions(-)
  create mode 100644 tools/testing/selftests/kvm/x86_64/vmx_nested_tsc_scaling_test.c

--
2.17.1


Queued, thanks.

The new kvm_x86_ops should go in kvm_x86_ops.nested, but those are not yet static_calls so we can leave that for later.

Paolo




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux