mbox series

[v2,00/13] KVM: x86: Allow userspace to disable the emulator

Message ID 20200218232953.5724-1-sean.j.christopherson@intel.com (mailing list archive)
Headers show
Series KVM: x86: Allow userspace to disable the emulator | expand

Message

Sean Christopherson Feb. 18, 2020, 11:29 p.m. UTC
The primary intent of this series is to dynamically allocate the emulator
and get KVM to a state where the emulator *could* be disabled at some
point in the future.  Actually allowing userspace to disable the emulator
was a minor change at that point, so I threw it in.

Dynamically allocating the emulator shrinks the size of x86 vcpus by
~2.5k bytes, which is important because 'struct vcpu_vmx' has once again
fattened up and squeaked past the PAGE_ALLOC_COSTLY_ORDER threshold.
Moving the emulator to its own allocation gives us some breathing room
for the near future, and has some other nice side effects.

As for disabling the emulator... in the not-too-distant future, I expect
there will be use cases that can truly disable KVM's emulator, e.g. for
security (KVM's and/or the guests).  I don't have a strong opinion on
whether or not KVM should actually allow userspace to disable the emulator
without a concrete use case (unless there already is a use case?), which
is why that part is done in its own tiny patch.

Running without an emulator has been "tested" in the sense that the
selftests that don't require emulation continue to pass, and everything
else fails with the expected "emulation error".

v2:
  - Rebase to kvm/queue, 2c2787938512 ("KVM: selftests: Stop ...")

Sean Christopherson (13):
  KVM: x86: Refactor I/O emulation helpers to provide vcpu-only variant
  KVM: x86: Explicitly pass an exception struct to check_intercept
  KVM: x86: Move emulation-only helpers to emulate.c
  KVM: x86: Refactor R/W page helper to take the emulation context
  KVM: x86: Refactor emulated exception injection to take the emul
    context
  KVM: x86: Refactor emulate tracepoint to explicitly take context
  KVM: x86: Refactor init_emulate_ctxt() to explicitly take context
  KVM: x86: Dynamically allocate per-vCPU emulation context
  KVM: x86: Move kvm_emulate.h into KVM's private directory
  KVM: x86: Shrink the usercopy region of the emulation context
  KVM: x86: Add helper to "handle" internal emulation error
  KVM: x86: Add variable to control existence of emulator
  KVM: x86: Allow userspace to disable the kernel's emulator

 arch/x86/include/asm/kvm_host.h             |  12 +-
 arch/x86/kvm/emulate.c                      |  13 +-
 arch/x86/{include/asm => kvm}/kvm_emulate.h |   9 +-
 arch/x86/kvm/mmu/mmu.c                      |   1 +
 arch/x86/kvm/svm.c                          |   5 +-
 arch/x86/kvm/trace.h                        |  22 +--
 arch/x86/kvm/vmx/vmx.c                      |  15 +-
 arch/x86/kvm/x86.c                          | 193 +++++++++++++-------
 arch/x86/kvm/x86.h                          |  12 +-
 9 files changed, 183 insertions(+), 99 deletions(-)
 rename arch/x86/{include/asm => kvm}/kvm_emulate.h (99%)

Comments

Paolo Bonzini March 2, 2020, 6:42 p.m. UTC | #1
On 19/02/20 00:29, Sean Christopherson wrote:
> The primary intent of this series is to dynamically allocate the emulator
> and get KVM to a state where the emulator *could* be disabled at some
> point in the future.  Actually allowing userspace to disable the emulator
> was a minor change at that point, so I threw it in.
> 
> Dynamically allocating the emulator shrinks the size of x86 vcpus by
> ~2.5k bytes, which is important because 'struct vcpu_vmx' has once again
> fattened up and squeaked past the PAGE_ALLOC_COSTLY_ORDER threshold.
> Moving the emulator to its own allocation gives us some breathing room
> for the near future, and has some other nice side effects.
> 
> As for disabling the emulator... in the not-too-distant future, I expect
> there will be use cases that can truly disable KVM's emulator, e.g. for
> security (KVM's and/or the guests).  I don't have a strong opinion on
> whether or not KVM should actually allow userspace to disable the emulator
> without a concrete use case (unless there already is a use case?), which
> is why that part is done in its own tiny patch.
> 
> Running without an emulator has been "tested" in the sense that the
> selftests that don't require emulation continue to pass, and everything
> else fails with the expected "emulation error".

I agree with Vitaly that, if we want this, it should be a KVM_ENABLE_CAP
instead.  The first 10 patches are very nice cleanups though so I plan
to apply them (with Vitaly's suggested nits for review) after you answer
the question on patch 10.

Paolo

> 
> v2:
>   - Rebase to kvm/queue, 2c2787938512 ("KVM: selftests: Stop ...")
> 
> Sean Christopherson (13):
>   KVM: x86: Refactor I/O emulation helpers to provide vcpu-only variant
>   KVM: x86: Explicitly pass an exception struct to check_intercept
>   KVM: x86: Move emulation-only helpers to emulate.c
>   KVM: x86: Refactor R/W page helper to take the emulation context
>   KVM: x86: Refactor emulated exception injection to take the emul
>     context
>   KVM: x86: Refactor emulate tracepoint to explicitly take context
>   KVM: x86: Refactor init_emulate_ctxt() to explicitly take context
>   KVM: x86: Dynamically allocate per-vCPU emulation context
>   KVM: x86: Move kvm_emulate.h into KVM's private directory
>   KVM: x86: Shrink the usercopy region of the emulation context
>   KVM: x86: Add helper to "handle" internal emulation error
>   KVM: x86: Add variable to control existence of emulator
>   KVM: x86: Allow userspace to disable the kernel's emulator
> 
>  arch/x86/include/asm/kvm_host.h             |  12 +-
>  arch/x86/kvm/emulate.c                      |  13 +-
>  arch/x86/{include/asm => kvm}/kvm_emulate.h |   9 +-
>  arch/x86/kvm/mmu/mmu.c                      |   1 +
>  arch/x86/kvm/svm.c                          |   5 +-
>  arch/x86/kvm/trace.h                        |  22 +--
>  arch/x86/kvm/vmx/vmx.c                      |  15 +-
>  arch/x86/kvm/x86.c                          | 193 +++++++++++++-------
>  arch/x86/kvm/x86.h                          |  12 +-
>  9 files changed, 183 insertions(+), 99 deletions(-)
>  rename arch/x86/{include/asm => kvm}/kvm_emulate.h (99%)
>
Sean Christopherson March 2, 2020, 8:02 p.m. UTC | #2
On Mon, Mar 02, 2020 at 07:42:31PM +0100, Paolo Bonzini wrote:
> On 19/02/20 00:29, Sean Christopherson wrote:
> > The primary intent of this series is to dynamically allocate the emulator
> > and get KVM to a state where the emulator *could* be disabled at some
> > point in the future.  Actually allowing userspace to disable the emulator
> > was a minor change at that point, so I threw it in.
> > 
> > Dynamically allocating the emulator shrinks the size of x86 vcpus by
> > ~2.5k bytes, which is important because 'struct vcpu_vmx' has once again
> > fattened up and squeaked past the PAGE_ALLOC_COSTLY_ORDER threshold.
> > Moving the emulator to its own allocation gives us some breathing room
> > for the near future, and has some other nice side effects.
> > 
> > As for disabling the emulator... in the not-too-distant future, I expect
> > there will be use cases that can truly disable KVM's emulator, e.g. for
> > security (KVM's and/or the guests).  I don't have a strong opinion on
> > whether or not KVM should actually allow userspace to disable the emulator
> > without a concrete use case (unless there already is a use case?), which
> > is why that part is done in its own tiny patch.
> > 
> > Running without an emulator has been "tested" in the sense that the
> > selftests that don't require emulation continue to pass, and everything
> > else fails with the expected "emulation error".
> 
> I agree with Vitaly that, if we want this, it should be a KVM_ENABLE_CAP
> instead.  The first 10 patches are very nice cleanups though so I plan
> to apply them (with Vitaly's suggested nits for review) after you answer
> the question on patch 10.

Works for me, thanks!