[0/4] KVM: VMX: Preemptivly optimize VMX instrs
mbox series

Message ID 20190719172540.7697-1-sean.j.christopherson@intel.com
Headers show
Series
  • KVM: VMX: Preemptivly optimize VMX instrs
Related show

Message

Sean Christopherson July 19, 2019, 5:25 p.m. UTC
An in-flight patch[1] to make __kvm_handle_fault_on_reboot() play nice
with objtool will add a JMP after most VMX instructions so that the reboot
macro can use an actual CALL to kvm_spurious_fault() instead of a funky
PUSH+JMP facsimile.

Rework the low level VMX instruction helpers to handle unexpected faults
manually instead of relying on the "fault on reboot" macro.  By using
asm-goto, most helpers can branch directly to an in-function call to
kvm_spurious_fault(), which can then be optimized by compilers to reside
out-of-line at the end of the function instead of inline as done by
"fault on reboot".

The net impact relative to the current code base is more or less a nop
when building with a compiler that supports __GCC_ASM_FLAG_OUTPUTS__.
A bunch of code that was previously in .fixup gets moved into the slow
paths of functions, but the fast paths are more basically unchanged.

Without __GCC_ASM_FLAG_OUTPUTS__, manually coding the Jcc is a net
positive as CC_SET() without compiler support almost always generates a
SETcc+CMP+Jcc sequence, which is now replaced with a single Jcc.

A small bonus is that the Jcc instrs are hinted to predict that the VMX
instr will be successful.

[1] https://lkml.kernel.org/r/64a9b64d127e87b6920a97afde8e96ea76f6524e.1563413318.git.jpoimboe@redhat.com

Sean Christopherson (4):
  objtool: KVM: x86: Check kvm_rebooting in kvm_spurious_fault()
  KVM: VMX: Optimize VMX instruction error and fault handling
  KVM: VMX: Add error handling to VMREAD helper
  KVM: x86: Drop ____kvm_handle_fault_on_reboot()

 arch/x86/include/asm/kvm_host.h |  6 +--
 arch/x86/kvm/vmx/ops.h          | 93 ++++++++++++++++++++-------------
 arch/x86/kvm/vmx/vmx.c          | 42 +++++++++++++++
 arch/x86/kvm/x86.c              |  3 +-
 tools/objtool/check.c           |  1 -
 5 files changed, 102 insertions(+), 43 deletions(-)

Comments

Paolo Bonzini July 19, 2019, 6:01 p.m. UTC | #1
On 19/07/19 19:25, Sean Christopherson wrote:
> An in-flight patch[1] to make __kvm_handle_fault_on_reboot() play nice
> with objtool will add a JMP after most VMX instructions so that the reboot
> macro can use an actual CALL to kvm_spurious_fault() instead of a funky
> PUSH+JMP facsimile.
> 
> Rework the low level VMX instruction helpers to handle unexpected faults
> manually instead of relying on the "fault on reboot" macro.  By using
> asm-goto, most helpers can branch directly to an in-function call to
> kvm_spurious_fault(), which can then be optimized by compilers to reside
> out-of-line at the end of the function instead of inline as done by
> "fault on reboot".
> 
> The net impact relative to the current code base is more or less a nop
> when building with a compiler that supports __GCC_ASM_FLAG_OUTPUTS__.
> A bunch of code that was previously in .fixup gets moved into the slow
> paths of functions, but the fast paths are more basically unchanged.
> 
> Without __GCC_ASM_FLAG_OUTPUTS__, manually coding the Jcc is a net
> positive as CC_SET() without compiler support almost always generates a
> SETcc+CMP+Jcc sequence, which is now replaced with a single Jcc.
> 
> A small bonus is that the Jcc instrs are hinted to predict that the VMX
> instr will be successful.
> 
> [1] https://lkml.kernel.org/r/64a9b64d127e87b6920a97afde8e96ea76f6524e.1563413318.git.jpoimboe@redhat.com
> 
> Sean Christopherson (4):
>   objtool: KVM: x86: Check kvm_rebooting in kvm_spurious_fault()
>   KVM: VMX: Optimize VMX instruction error and fault handling
>   KVM: VMX: Add error handling to VMREAD helper
>   KVM: x86: Drop ____kvm_handle_fault_on_reboot()
> 
>  arch/x86/include/asm/kvm_host.h |  6 +--
>  arch/x86/kvm/vmx/ops.h          | 93 ++++++++++++++++++++-------------
>  arch/x86/kvm/vmx/vmx.c          | 42 +++++++++++++++
>  arch/x86/kvm/x86.c              |  3 +-
>  tools/objtool/check.c           |  1 -
>  5 files changed, 102 insertions(+), 43 deletions(-)
> 

Sean, would you mind basing these on top of Josh's patches, so that
Peter can add them to his tree?

Paolo
Paolo Bonzini July 19, 2019, 6:01 p.m. UTC | #2
On 19/07/19 19:25, Sean Christopherson wrote:
> An in-flight patch[1] to make __kvm_handle_fault_on_reboot() play nice
> with objtool will add a JMP after most VMX instructions so that the reboot
> macro can use an actual CALL to kvm_spurious_fault() instead of a funky
> PUSH+JMP facsimile.
> 
> Rework the low level VMX instruction helpers to handle unexpected faults
> manually instead of relying on the "fault on reboot" macro.  By using
> asm-goto, most helpers can branch directly to an in-function call to
> kvm_spurious_fault(), which can then be optimized by compilers to reside
> out-of-line at the end of the function instead of inline as done by
> "fault on reboot".
> 
> The net impact relative to the current code base is more or less a nop
> when building with a compiler that supports __GCC_ASM_FLAG_OUTPUTS__.
> A bunch of code that was previously in .fixup gets moved into the slow
> paths of functions, but the fast paths are more basically unchanged.
> 
> Without __GCC_ASM_FLAG_OUTPUTS__, manually coding the Jcc is a net
> positive as CC_SET() without compiler support almost always generates a
> SETcc+CMP+Jcc sequence, which is now replaced with a single Jcc.
> 
> A small bonus is that the Jcc instrs are hinted to predict that the VMX
> instr will be successful.
> 
> [1] https://lkml.kernel.org/r/64a9b64d127e87b6920a97afde8e96ea76f6524e.1563413318.git.jpoimboe@redhat.com
> 
> Sean Christopherson (4):
>   objtool: KVM: x86: Check kvm_rebooting in kvm_spurious_fault()
>   KVM: VMX: Optimize VMX instruction error and fault handling
>   KVM: VMX: Add error handling to VMREAD helper
>   KVM: x86: Drop ____kvm_handle_fault_on_reboot()
> 
>  arch/x86/include/asm/kvm_host.h |  6 +--
>  arch/x86/kvm/vmx/ops.h          | 93 ++++++++++++++++++++-------------
>  arch/x86/kvm/vmx/vmx.c          | 42 +++++++++++++++
>  arch/x86/kvm/x86.c              |  3 +-
>  tools/objtool/check.c           |  1 -
>  5 files changed, 102 insertions(+), 43 deletions(-)
> 

Very nice - series

Acked-by: Paolo Bonzini <pbonzini@redhat.com>

Paolo
Josh Poimboeuf July 19, 2019, 6:27 p.m. UTC | #3
On Fri, Jul 19, 2019 at 08:01:23PM +0200, Paolo Bonzini wrote:
> On 19/07/19 19:25, Sean Christopherson wrote:
> > An in-flight patch[1] to make __kvm_handle_fault_on_reboot() play nice
> > with objtool will add a JMP after most VMX instructions so that the reboot
> > macro can use an actual CALL to kvm_spurious_fault() instead of a funky
> > PUSH+JMP facsimile.
> > 
> > Rework the low level VMX instruction helpers to handle unexpected faults
> > manually instead of relying on the "fault on reboot" macro.  By using
> > asm-goto, most helpers can branch directly to an in-function call to
> > kvm_spurious_fault(), which can then be optimized by compilers to reside
> > out-of-line at the end of the function instead of inline as done by
> > "fault on reboot".
> > 
> > The net impact relative to the current code base is more or less a nop
> > when building with a compiler that supports __GCC_ASM_FLAG_OUTPUTS__.
> > A bunch of code that was previously in .fixup gets moved into the slow
> > paths of functions, but the fast paths are more basically unchanged.
> > 
> > Without __GCC_ASM_FLAG_OUTPUTS__, manually coding the Jcc is a net
> > positive as CC_SET() without compiler support almost always generates a
> > SETcc+CMP+Jcc sequence, which is now replaced with a single Jcc.
> > 
> > A small bonus is that the Jcc instrs are hinted to predict that the VMX
> > instr will be successful.
> > 
> > [1] https://lkml.kernel.org/r/64a9b64d127e87b6920a97afde8e96ea76f6524e.1563413318.git.jpoimboe@redhat.com
> > 
> > Sean Christopherson (4):
> >   objtool: KVM: x86: Check kvm_rebooting in kvm_spurious_fault()
> >   KVM: VMX: Optimize VMX instruction error and fault handling
> >   KVM: VMX: Add error handling to VMREAD helper
> >   KVM: x86: Drop ____kvm_handle_fault_on_reboot()
> > 
> >  arch/x86/include/asm/kvm_host.h |  6 +--
> >  arch/x86/kvm/vmx/ops.h          | 93 ++++++++++++++++++++-------------
> >  arch/x86/kvm/vmx/vmx.c          | 42 +++++++++++++++
> >  arch/x86/kvm/x86.c              |  3 +-
> >  tools/objtool/check.c           |  1 -
> >  5 files changed, 102 insertions(+), 43 deletions(-)
> > 
> 
> Sean, would you mind basing these on top of Josh's patches, so that
> Peter can add them to his tree?

Sean, FYI, my patches are already in tip/master so these can be based on
that.  I'm guessing the commit IDs are presumably stable, so the commits
can be referenced instead of the lkml link.