On Tue, 28 Apr 2020 at 02:42, Sean Christopherson <sean.j.christopherson@xxxxxxxxx> wrote: > > On Fri, Apr 24, 2020 at 02:22:44PM +0800, Wanpeng Li wrote: > > From: Wanpeng Li <wanpengli@xxxxxxxxxxx> > > > > This patch implements handle preemption timer fastpath, after timer fire > > due to VMX-preemption timer counts down to zero, handle it as soon as > > possible and vmentry immediately without checking various kvm stuff when > > possible. > > > > Testing on SKX Server. > > > > cyclictest in guest(w/o mwait exposed, adaptive advance lapic timer is default -1): > > > > 5540.5ns -> 4602ns 17% > > > > kvm-unit-test/vmexit.flat: > > > > w/o avanced timer: > > tscdeadline_immed: 2885 -> 2431.25 15.7% > > tscdeadline: 5668.75 -> 5188.5 8.4% > > > > w/ adaptive advance timer default -1: > > tscdeadline_immed: 2965.25 -> 2520 15.0% > > tscdeadline: 4663.75 -> 4537 2.7% > > > > Tested-by: Haiwei Li <lihaiwei@xxxxxxxxxxx> > > Cc: Haiwei Li <lihaiwei@xxxxxxxxxxx> > > Signed-off-by: Wanpeng Li <wanpengli@xxxxxxxxxxx> > > --- > > arch/x86/kvm/vmx/vmx.c | 16 ++++++++++++++++ > > 1 file changed, 16 insertions(+) > > > > diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c > > index d21b66b..028967a 100644 > > --- a/arch/x86/kvm/vmx/vmx.c > > +++ b/arch/x86/kvm/vmx/vmx.c > > @@ -6560,12 +6560,28 @@ void vmx_update_host_rsp(struct vcpu_vmx *vmx, unsigned long host_rsp) > > } > > } > > > > +static enum exit_fastpath_completion handle_fastpath_preemption_timer(struct kvm_vcpu *vcpu) > > Somewhat offtopic, would it make sense to add a fastpath_t typedef? These > enum lines are a bit long... > > > +{ > > + struct vcpu_vmx *vmx = to_vmx(vcpu); > > + > > + if (!vmx->req_immediate_exit && > > + !unlikely(vmx->loaded_vmcs->hv_timer_soft_disabled)) { > > Bad indentation. > > Also, this is is identical to handle_preemption_timer(), why not something > like: > > static bool __handle_preemption_timer(struct vcpu) > { > struct vcpu_vmx *vmx = to_vmx(vcpu); > > if (!vmx->req_immediate_exit && > !unlikely(vmx->loaded_vmcs->hv_timer_soft_disabled)) { > kvm_lapic_expired_hv_timer(vcpu); > return true; > } > > return false; > } > > static enum exit_fastpath_completion handle_fastpath_preemption_timer(struct kvm_vcpu *vcpu) > { > if (__handle_preemption_timer(vcpu)) > return EXIT_FASTPATH_CONT_RUN; > return EXIT_FASTPATH_NONE; > } > > static int handle_preemption_timer(struct kvm_vcpu *vcpu) > { > __handle_preemption_timer(vcpu); > return 1; > } > Great! Thanks for making this nicer. Wanpeng