From: Ilias Stamatis <ilstam@xxxxxxxxxx> KVM currently supports hardware-assisted TSC scaling but only for L1 and it doesn't expose the feature 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. When scaling and offsetting is applied, the TSC for the guest is calculated as: (TSC * multiplier >> 48) + offset With nested scaling the values in VMCS01 and VMCS12 need to be merged together and stored in VMCS02. The VMCS02 values are calculated as follows: offset_02 = ((offset_01 * mult_12) >> 48) + offset_12 mult_02 = (mult_01 * mult_12) >> 48 The last patch of the series adds a KVM selftest. Ilias Stamatis (8): KVM: VMX: Add a TSC multiplier field in VMCS12 KVM: X86: Store L1's TSC scaling ratio in 'struct kvm_vcpu_arch' KVM: X86: Pass an additional 'L1' argument to kvm_scale_tsc() KVM: VMX: Adjust the TSC-related VMCS fields on L2 entry and exit KVM: X86: Move tracing outside write_l1_tsc_offset() KVM: VMX: Make vmx_write_l1_tsc_offset() work with nested TSC scaling KVM: VMX: Expose TSC scaling to L2 KVM: selftests: x86: Add vmx_nested_tsc_scaling_test arch/x86/include/asm/kvm_host.h | 8 +- arch/x86/kvm/svm/svm.c | 4 - arch/x86/kvm/vmx/nested.c | 32 ++- arch/x86/kvm/vmx/vmcs12.c | 1 + arch/x86/kvm/vmx/vmcs12.h | 4 +- arch/x86/kvm/vmx/vmx.c | 31 ++- arch/x86/kvm/x86.c | 54 ++++- tools/testing/selftests/kvm/.gitignore | 1 + tools/testing/selftests/kvm/Makefile | 1 + .../kvm/x86_64/vmx_nested_tsc_scaling_test.c | 209 ++++++++++++++++++ 10 files changed, 312 insertions(+), 33 deletions(-) create mode 100644 tools/testing/selftests/kvm/x86_64/vmx_nested_tsc_scaling_test.c -- 2.17.1