mbox series

[v4,00/11] KVM: Implement nested TSC scaling

Message ID 20210526184418.28881-1-ilstam@amazon.com (mailing list archive)
Headers show
Series KVM: Implement nested TSC scaling | expand

Message

Ilias Stamatis May 26, 2021, 6:44 p.m. UTC
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:

Only patch 9 needs reviewing at this point, but I am re-sending the
whole series as I also applied nitpicks suggested to some of the other
pathces.

v4:
  - Added vendor callbacks for writing the TSC multiplier
  - Moved the VMCS multiplier writes from the VMCS load path to common
    code that only gets called on TSC ratio changes
  - Merged together patches 10 and 11 of v3
  - Applied all nitpick-feedback of the previous versions

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 (11):
  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_l1_tsc_offset()
  KVM: X86: Add a ratio parameter to kvm_scale_tsc()
  KVM: nVMX: 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 the nested TSC fields
  KVM: X86: Move write_l1_tsc_offset() logic to common code and rename
    it
  KVM: X86: Add vendor callbacks for writing the TSC multiplier
  KVM: nVMX: Enable nested TSC scaling
  KVM: selftests: x86: Add vmx_nested_tsc_scaling_test

 arch/x86/include/asm/kvm-x86-ops.h            |   5 +-
 arch/x86/include/asm/kvm_host.h               |  15 +-
 arch/x86/kvm/svm/svm.c                        |  35 ++-
 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                        |  55 ++--
 arch/x86/kvm/vmx/vmx.h                        |  11 +-
 arch/x86/kvm/x86.c                            | 114 +++++++--
 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, 451 insertions(+), 85 deletions(-)
 create mode 100644 tools/testing/selftests/kvm/x86_64/vmx_nested_tsc_scaling_test.c

Comments

Ilias Stamatis June 15, 2021, 8:44 a.m. UTC | #1
On Wed, 2021-05-26 at 19:44 +0100, 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:
> 
> Only patch 9 needs reviewing at this point, but I am re-sending the
> whole series as I also applied nitpicks suggested to some of the other
> pathces.
> 
> v4:
>   - Added vendor callbacks for writing the TSC multiplier
>   - Moved the VMCS multiplier writes from the VMCS load path to common
>     code that only gets called on TSC ratio changes
>   - Merged together patches 10 and 11 of v3
>   - Applied all nitpick-feedback of the previous versions
> 
> 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 (11):
>   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_l1_tsc_offset()
>   KVM: X86: Add a ratio parameter to kvm_scale_tsc()
>   KVM: nVMX: 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 the nested TSC fields
>   KVM: X86: Move write_l1_tsc_offset() logic to common code and rename
>     it
>   KVM: X86: Add vendor callbacks for writing the TSC multiplier
>   KVM: nVMX: Enable nested TSC scaling
>   KVM: selftests: x86: Add vmx_nested_tsc_scaling_test
> 
>  arch/x86/include/asm/kvm-x86-ops.h            |   5 +-
>  arch/x86/include/asm/kvm_host.h               |  15 +-
>  arch/x86/kvm/svm/svm.c                        |  35 ++-
>  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                        |  55 ++--
>  arch/x86/kvm/vmx/vmx.h                        |  11 +-
>  arch/x86/kvm/x86.c                            | 114 +++++++--
>  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, 451 insertions(+), 85 deletions(-)
>  create mode 100644 tools/testing/selftests/kvm/x86_64/vmx_nested_tsc_scaling_test.c
> 

Hello,

What is the status of these? I think all patches have been reviewed and
approved at this point.

(There's a new revision v6 of patch 9 that has been reviewed too)

Thanks,
Ilias
Ilias Stamatis June 15, 2021, 9:33 a.m. UTC | #2
On Tue, 2021-06-15 at 09:43 +0100, Ilias Stamatis wrote:
> On Wed, 2021-05-26 at 19:44 +0100, 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:
> > 
> > Only patch 9 needs reviewing at this point, but I am re-sending the
> > whole series as I also applied nitpicks suggested to some of the other
> > pathces.
> > 
> > v4:
> >   - Added vendor callbacks for writing the TSC multiplier
> >   - Moved the VMCS multiplier writes from the VMCS load path to common
> >     code that only gets called on TSC ratio changes
> >   - Merged together patches 10 and 11 of v3
> >   - Applied all nitpick-feedback of the previous versions
> > 
> > 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 (11):
> >   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_l1_tsc_offset()
> >   KVM: X86: Add a ratio parameter to kvm_scale_tsc()
> >   KVM: nVMX: 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 the nested TSC fields
> >   KVM: X86: Move write_l1_tsc_offset() logic to common code and rename
> >     it
> >   KVM: X86: Add vendor callbacks for writing the TSC multiplier
> >   KVM: nVMX: Enable nested TSC scaling
> >   KVM: selftests: x86: Add vmx_nested_tsc_scaling_test
> > 
> >  arch/x86/include/asm/kvm-x86-ops.h            |   5 +-
> >  arch/x86/include/asm/kvm_host.h               |  15 +-
> >  arch/x86/kvm/svm/svm.c                        |  35 ++-
> >  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                        |  55 ++--
> >  arch/x86/kvm/vmx/vmx.h                        |  11 +-
> >  arch/x86/kvm/x86.c                            | 114 +++++++--
> >  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, 451 insertions(+), 85 deletions(-)
> >  create mode 100644 tools/testing/selftests/kvm/x86_64/vmx_nested_tsc_scaling_test.c
> > 
> 
> Hello,
> 
> What is the status of these? I think all patches have been reviewed and
> approved at this point.
> 
> (There's a new revision v6 of patch 9 that has been reviewed too)
> 
> Thanks,
> Ilias

Never mind this, I was probably checking at the wrong place, I just realised
that they have been queued since last Friday.

Thanks!