From: Sean Christopherson <sean.j.christopherson@intel.com>
To: Wanpeng Li <kernellwp@gmail.com>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
Paolo Bonzini <pbonzini@redhat.com>,
Vitaly Kuznetsov <vkuznets@redhat.com>,
Wanpeng Li <wanpengli@tencent.com>,
Jim Mattson <jmattson@google.com>, Joerg Roedel <joro@8bytes.org>,
Haiwei Li <lihaiwei@tencent.com>
Subject: Re: [PATCH v3 2/5] KVM: X86: Introduce need_cancel_enter_guest helper
Date: Mon, 27 Apr 2020 11:30:13 -0700 [thread overview]
Message-ID: <20200427183013.GN14870@linux.intel.com> (raw)
In-Reply-To: <1587709364-19090-3-git-send-email-wanpengli@tencent.com>
On Fri, Apr 24, 2020 at 02:22:41PM +0800, Wanpeng Li wrote:
> From: Wanpeng Li <wanpengli@tencent.com>
>
> Introduce need_cancel_enter_guest() helper, we need to check some
> conditions before doing CONT_RUN, in addition, it can also catch
> the case vmexit occurred while another event was being delivered
> to guest software since vmx_complete_interrupts() adds the request
> bit.
>
> Tested-by: Haiwei Li <lihaiwei@tencent.com>
> Cc: Haiwei Li <lihaiwei@tencent.com>
> Signed-off-by: Wanpeng Li <wanpengli@tencent.com>
> ---
> arch/x86/kvm/vmx/vmx.c | 12 +++++++-----
> arch/x86/kvm/x86.c | 10 ++++++++--
> arch/x86/kvm/x86.h | 1 +
> 3 files changed, 16 insertions(+), 7 deletions(-)
>
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index f1f6638..5c21027 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -6577,7 +6577,7 @@ bool __vmx_vcpu_run(struct vcpu_vmx *vmx, unsigned long *regs, bool launched);
>
> static enum exit_fastpath_completion vmx_vcpu_run(struct kvm_vcpu *vcpu)
> {
> - enum exit_fastpath_completion exit_fastpath;
> + enum exit_fastpath_completion exit_fastpath = EXIT_FASTPATH_NONE;
> struct vcpu_vmx *vmx = to_vmx(vcpu);
> unsigned long cr3, cr4;
>
> @@ -6754,10 +6754,12 @@ static enum exit_fastpath_completion vmx_vcpu_run(struct kvm_vcpu *vcpu)
> vmx_recover_nmi_blocking(vmx);
> vmx_complete_interrupts(vmx);
>
> - exit_fastpath = vmx_exit_handlers_fastpath(vcpu);
> - /* static call is better with retpolines */
> - if (exit_fastpath == EXIT_FASTPATH_CONT_RUN)
> - goto cont_run;
> + if (!kvm_need_cancel_enter_guest(vcpu)) {
> + exit_fastpath = vmx_exit_handlers_fastpath(vcpu);
> + /* static call is better with retpolines */
> + if (exit_fastpath == EXIT_FASTPATH_CONT_RUN)
> + goto cont_run;
> + }
>
> return exit_fastpath;
> }
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 59958ce..4561104 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -1581,6 +1581,13 @@ int kvm_emulate_wrmsr(struct kvm_vcpu *vcpu)
> }
> EXPORT_SYMBOL_GPL(kvm_emulate_wrmsr);
>
> +bool kvm_need_cancel_enter_guest(struct kvm_vcpu *vcpu)
What about kvm_vcpu_<???>_pending()? Not sure what a good ??? would be.
The "cancel_enter_guest" wording is a bit confusing when this is called
from the VM-Exit path.
> +{
> + return (vcpu->mode == EXITING_GUEST_MODE || kvm_request_pending(vcpu)
> + || need_resched() || signal_pending(current));
Parantheses around the whole statement are unnecessary. Personal preference
is to put the || before the newline.
> +}
> +EXPORT_SYMBOL_GPL(kvm_need_cancel_enter_guest);
> +
> /*
> * The fast path for frequent and performance sensitive wrmsr emulation,
> * i.e. the sending of IPI, sending IPI early in the VM-Exit flow reduces
> @@ -8373,8 +8380,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
> if (kvm_lapic_enabled(vcpu) && vcpu->arch.apicv_active)
> kvm_x86_ops.sync_pir_to_irr(vcpu);
>
> - if (vcpu->mode == EXITING_GUEST_MODE || kvm_request_pending(vcpu)
> - || need_resched() || signal_pending(current)) {
> + if (kvm_need_cancel_enter_guest(vcpu)) {
> vcpu->mode = OUTSIDE_GUEST_MODE;
> smp_wmb();
> local_irq_enable();
> diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h
> index 7b5ed8e..1906e7e 100644
> --- a/arch/x86/kvm/x86.h
> +++ b/arch/x86/kvm/x86.h
> @@ -364,5 +364,6 @@ static inline bool kvm_dr7_valid(u64 data)
> void kvm_load_guest_xsave_state(struct kvm_vcpu *vcpu);
> void kvm_load_host_xsave_state(struct kvm_vcpu *vcpu);
> u64 kvm_spec_ctrl_valid_bits(struct kvm_vcpu *vcpu);
> +bool kvm_need_cancel_enter_guest(struct kvm_vcpu *vcpu);
>
> #endif
> --
> 2.7.4
>
next prev parent reply other threads:[~2020-04-27 18:30 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-24 6:22 [PATCH v3 0/5] KVM: VMX: Tscdeadline timer emulation fastpath Wanpeng Li
2020-04-24 6:22 ` [PATCH v3 1/5] KVM: VMX: Introduce generic fastpath handler Wanpeng Li
2020-04-27 18:26 ` Sean Christopherson
2020-04-28 0:47 ` Wanpeng Li
2020-04-24 6:22 ` [PATCH v3 2/5] KVM: X86: Introduce need_cancel_enter_guest helper Wanpeng Li
2020-04-26 2:05 ` Wanpeng Li
2020-04-27 18:36 ` Sean Christopherson
2020-04-28 0:44 ` Wanpeng Li
2020-04-28 1:03 ` Sean Christopherson
2020-04-27 18:30 ` Sean Christopherson [this message]
2020-04-28 7:17 ` Wanpeng Li
2020-04-24 6:22 ` [PATCH v3 3/5] KVM: VMX: Optimize posted-interrupt delivery for timer fastpath Wanpeng Li
2020-04-27 18:37 ` Sean Christopherson
2020-04-24 6:22 ` [PATCH v3 4/5] KVM: X86: TSCDEADLINE MSR emulation fastpath Wanpeng Li
2020-04-27 18:38 ` Sean Christopherson
2020-04-24 6:22 ` [PATCH v3 5/5] KVM: VMX: Handle preemption timer fastpath Wanpeng Li
2020-04-27 18:42 ` Sean Christopherson
2020-04-28 0:45 ` Wanpeng Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200427183013.GN14870@linux.intel.com \
--to=sean.j.christopherson@intel.com \
--cc=jmattson@google.com \
--cc=joro@8bytes.org \
--cc=kernellwp@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=lihaiwei@tencent.com \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=vkuznets@redhat.com \
--cc=wanpengli@tencent.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.