On Thu, Mar 27, 2014 at 12:30:34PM +0100, Paolo Bonzini wrote: > About 25% of the time spent in emulation of invalid guest state > is wasted in checking whether emulation is required for the next > instruction. However, this almost never changes except when a > segment register (or TR or LDTR) changes, or when there is a mode > transition (i.e. CR0 changes). > > In fact, vmx_set_segment and vmx_set_cr0 already modify > vmx->emulation_required (except that the former for some reason > uses |= instead of just an assignment). So there is no need to > call guest_state_valid in the emulation loop. > > Emulation performance test results indicate 530-870 cycles > for common instructions, versus 740-1110 before this patch. > > Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx> > --- > arch/x86/kvm/vmx.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c > index 1320e0f8e611..73aa522db47b 100644 > --- a/arch/x86/kvm/vmx.c > +++ b/arch/x86/kvm/vmx.c > @@ -3629,7 +3629,7 @@ static void vmx_set_segment(struct kvm_vcpu *vcpu, > vmcs_write32(sf->ar_bytes, vmx_segment_access_rights(var)); > > out: > - vmx->emulation_required |= emulation_required(vcpu); > + vmx->emulation_required = emulation_required(vcpu); > } > > static void vmx_get_cs_db_l_bits(struct kvm_vcpu *vcpu, int *db, int *l) > @@ -5580,7 +5580,7 @@ static int handle_invalid_guest_state(struct kvm_vcpu *vcpu) > cpu_exec_ctrl = vmcs_read32(CPU_BASED_VM_EXEC_CONTROL); > intr_window_requested = cpu_exec_ctrl & CPU_BASED_VIRTUAL_INTR_PENDING; > > - while (!guest_state_valid(vcpu) && count-- != 0) { > + while (vmx->emulation_required && count-- != 0) { > if (intr_window_requested && vmx_interrupt_allowed(vcpu)) > return handle_interrupt_window(&vmx->vcpu); > > @@ -5614,7 +5614,6 @@ static int handle_invalid_guest_state(struct kvm_vcpu *vcpu) > schedule(); > } > > - vmx->emulation_required = emulation_required(vcpu); > out: > return ret; > } > -- > 1.8.3.1 How about handling VM-entry error due to invalid state with vmx->emulation_required = true; continue to main vcpu loop; -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html