mbox series

[0/8] KVM: VMX: Implement nested TSC scaling

Message ID 20210506103228.67864-1-ilstam@mailbox.org (mailing list archive)
Headers show
Series KVM: VMX: Implement nested TSC scaling | expand

Message

ilstam@mailbox.org May 6, 2021, 10:32 a.m. UTC
From: Ilias Stamatis <ilstam@amazon.com>

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

Comments

Jim Mattson May 6, 2021, 5:16 p.m. UTC | #1
On Thu, May 6, 2021 at 3:34 AM <ilstam@mailbox.org> wrote:
>
> From: Ilias Stamatis <ilstam@amazon.com>
>
> 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.

Will you be doing the same for SVM? The last time I tried to add a
nested virtualization feature for Intel only, Paolo rapped my knuckles
with a ruler.
Ilias Stamatis May 6, 2021, 5:48 p.m. UTC | #2
On Thu, 2021-05-06 at 10:16 -0700, Jim Mattson wrote:
> On Thu, May 6, 2021 at 3:34 AM <ilstam@mailbox.org> wrote:
> > 
> > From: Ilias Stamatis <ilstam@amazon.com>
> > 
> > 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.
> 
> Will you be doing the same for SVM? The last time I tried to add a
> nested virtualization feature for Intel only, Paolo rapped my knuckles
> with a ruler.

Yes, I can try do this, if it's not much more complicated, once I get
access to AMD hardware. 

But I suppose this series is standalone and could be merged separately?
By taking a quick look it seems that SVM exposes far less features to
nested guests than VMX does anyway.

Ilias
Maxim Levitsky May 10, 2021, 1:43 p.m. UTC | #3
On Thu, 2021-05-06 at 17:48 +0000, Stamatis, Ilias wrote:
> On Thu, 2021-05-06 at 10:16 -0700, Jim Mattson wrote:
> > On Thu, May 6, 2021 at 3:34 AM <ilstam@mailbox.org> wrote:
> > > From: Ilias Stamatis <ilstam@amazon.com>
> > > 
> > > 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.
> > 
> > Will you be doing the same for SVM? The last time I tried to add a
> > nested virtualization feature for Intel only, Paolo rapped my knuckles
> > with a ruler.
> 
> Yes, I can try do this, if it's not much more complicated, once I get
> access to AMD hardware. 

I have access to AMD hardware with regular TSC scaling,
and nested TSC scaling IMHO won't be hard for me to implement 
so I volunteer for this task! 


Best regards,
	Maxim Levitsky

> 
> But I suppose this series is standalone and could be merged separately?
> By taking a quick look it seems that SVM exposes far less features to
> nested guests than VMX does anyway.
> 
> Ilias
Paolo Bonzini May 10, 2021, 2:29 p.m. UTC | #4
On 06/05/21 19:16, Jim Mattson wrote:
> On Thu, May 6, 2021 at 3:34 AM <ilstam@mailbox.org> wrote:
>>
>> From: Ilias Stamatis <ilstam@amazon.com>
>>
>> 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.
> 
> Will you be doing the same for SVM? The last time I tried to add a
> nested virtualization feature for Intel only, Paolo rapped my knuckles
> with a ruler.

For bugfixes definitely, for features it is definitely nice.

And these days we even have similar-enough code between nVMX and nSVM 
code, that in many cases there's really no good excuse not to do it.

Paolo