From: 林鑫龙 <linxl3@wangsu.com>
To: "Wanpeng Li" <kernellwp@gmail.com>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Sean Christopherson" <sean.j.christopherson@intel.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 v4 6/7] KVM: X86: TSCDEADLINE MSR emulation fastpath
Date: Tue, 28 Apr 2020 17:58:30 +0800 (GMT+08:00) [thread overview]
Message-ID: <15150824.2a36.171c0394538.Coremail.linxl3@wangsu.com> (raw)
In-Reply-To: <1588055009-12677-7-git-send-email-wanpengli@tencent.com>
On Tuesday, 28 Apr 2020 at 14:23, Wanpeng Li <kernellwp@gmail.com> wrote:
>
> From: Wanpeng Li <wanpengli@tencent.com>
>
> This patch implements tscdealine msr emulation fastpath, after wrmsr
> tscdeadline vmexit, handle it as soon as possible and vmentry immediately
> without checking various kvm stuff when possible.
>
> Tested-by: Haiwei Li <lihaiwei@tencent.com>
> Cc: Haiwei Li <lihaiwei@tencent.com>
> Signed-off-by: Wanpeng Li <wanpengli@tencent.com>
> ---
> arch/x86/kvm/lapic.c | 18 ++++++++++++------
> arch/x86/kvm/vmx/vmx.c | 12 ++++++++----
> arch/x86/kvm/x86.c | 30 ++++++++++++++++++++++++------
> 3 files changed, 44 insertions(+), 16 deletions(-)
>
> diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
> index 38f7dc9..3589237 100644
> --- a/arch/x86/kvm/lapic.c
> +++ b/arch/x86/kvm/lapic.c
> @@ -1593,7 +1593,7 @@ static void kvm_apic_inject_pending_timer_irqs(struct kvm_lapic *apic)
> }
> }
>
> -static void apic_timer_expired(struct kvm_lapic *apic)
> +static void apic_timer_expired(struct kvm_lapic *apic, bool from_timer_fn)
> {
> struct kvm_vcpu *vcpu = apic->vcpu;
> struct kvm_timer *ktimer = &apic->lapic_timer;
> @@ -1604,6 +1604,12 @@ static void apic_timer_expired(struct kvm_lapic *apic)
> if (apic_lvtt_tscdeadline(apic) || ktimer->hv_timer_in_use)
> ktimer->expired_tscdeadline = ktimer->tscdeadline;
>
> + if (!from_timer_fn && vcpu->arch.apicv_active) {
> + WARN_ON(kvm_get_running_vcpu() != vcpu);
> + kvm_apic_inject_pending_timer_irqs(apic);
> + return;
> + }
> +
> if (kvm_use_posted_timer_interrupt(apic->vcpu)) {
> if (apic->lapic_timer.timer_advance_ns)
> __kvm_wait_lapic_expire(vcpu);
> @@ -1643,7 +1649,7 @@ static void start_sw_tscdeadline(struct kvm_lapic *apic)
> expire = ktime_sub_ns(expire, ktimer->timer_advance_ns);
> hrtimer_start(&ktimer->timer, expire, HRTIMER_MODE_ABS_HARD);
> } else
> - apic_timer_expired(apic);
> + apic_timer_expired(apic, false);
>
> local_irq_restore(flags);
> }
> @@ -1751,7 +1757,7 @@ static void start_sw_period(struct kvm_lapic *apic)
>
> if (ktime_after(ktime_get(),
> apic->lapic_timer.target_expiration)) {
> - apic_timer_expired(apic);
> + apic_timer_expired(apic, false);
>
> if (apic_lvtt_oneshot(apic))
> return;
> @@ -1813,7 +1819,7 @@ static bool start_hv_timer(struct kvm_lapic *apic)
> if (atomic_read(&ktimer->pending)) {
> cancel_hv_timer(apic);
> } else if (expired) {
> - apic_timer_expired(apic);
> + apic_timer_expired(apic, false);
> cancel_hv_timer(apic);
> }
> }
> @@ -1863,7 +1869,7 @@ void kvm_lapic_expired_hv_timer(struct kvm_vcpu *vcpu)
> goto out;
> WARN_ON(swait_active(&vcpu->wq));
> cancel_hv_timer(apic);
> - apic_timer_expired(apic);
> + apic_timer_expired(apic, false);
>
> if (apic_lvtt_period(apic) && apic->lapic_timer.period) {
> advance_periodic_target_expiration(apic);
> @@ -2369,7 +2375,7 @@ static enum hrtimer_restart apic_timer_fn(struct hrtimer *data)
> struct kvm_timer *ktimer = container_of(data, struct kvm_timer, timer);
> struct kvm_lapic *apic = container_of(ktimer, struct kvm_lapic, lapic_timer);
>
> - apic_timer_expired(apic);
> + apic_timer_expired(apic, true);
>
> if (lapic_is_periodic(apic)) {
> advance_periodic_target_expiration(apic);
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index ce19b0e..bb5c4f1 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -5994,7 +5994,8 @@ static int vmx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t exit_fastpath)
> if (exit_fastpath == EXIT_FASTPATH_SKIP_EMUL_INS) {
> kvm_skip_emulated_instruction(vcpu);
Can we move this kvm_skip_emulated_instruction to handle_fastpath_set_msr_irqoff? This will keep the style consistent.
> return 1;
> - }
> + } else if (exit_fastpath == EXIT_FASTPATH_NOP)
> + return 1;
>
> if (exit_reason >= kvm_vmx_max_exit_handlers)
> goto unexpected_vmexit;
> @@ -6605,6 +6606,7 @@ static fastpath_t vmx_vcpu_run(struct kvm_vcpu *vcpu)
> struct vcpu_vmx *vmx = to_vmx(vcpu);
> unsigned long cr3, cr4;
>
> +REENTER_GUEST:
> /* Record the guest's net vcpu time for enforced NMI injections. */
> if (unlikely(!enable_vnmi &&
> vmx->loaded_vmcs->soft_vnmi_blocked))
> @@ -6779,10 +6781,12 @@ static fastpath_t vmx_vcpu_run(struct kvm_vcpu *vcpu)
>
> exit_fastpath = vmx_exit_handlers_fastpath(vcpu);
> if (exit_fastpath == EXIT_FASTPATH_REENTER_GUEST) {
> - if (!kvm_vcpu_exit_request(vcpu))
> + if (!kvm_vcpu_exit_request(vcpu)) {
> vmx_sync_pir_to_irr(vcpu);
> - else
> - exit_fastpath = EXIT_FASTPATH_NOP;
> + /* static call is better with retpolines */
> + goto REENTER_GUEST;
> + }
> + exit_fastpath = EXIT_FASTPATH_NOP;
> }
>
> return exit_fastpath;
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index afe052c..f3a5fe4 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -1616,27 +1616,45 @@ static int handle_fastpath_set_x2apic_icr_irqoff(struct kvm_vcpu *vcpu, u64 data
> return 1;
> }
>
> +static int handle_fastpath_set_tscdeadline(struct kvm_vcpu *vcpu, u64 data)
> +{
> + if (!kvm_x86_ops.set_hv_timer ||
> + kvm_mwait_in_guest(vcpu->kvm) ||
> + kvm_can_post_timer_interrupt(vcpu))
> + return 1;
> +
> + kvm_set_lapic_tscdeadline_msr(vcpu, data);
> + return 0;
> +}
> +
> fastpath_t handle_fastpath_set_msr_irqoff(struct kvm_vcpu *vcpu)
> {
> u32 msr = kvm_rcx_read(vcpu);
> u64 data;
> - int ret = 0;
> + int ret = EXIT_FASTPATH_NONE;
>
> switch (msr) {
> case APIC_BASE_MSR + (APIC_ICR >> 4):
> data = kvm_read_edx_eax(vcpu);
> - ret = handle_fastpath_set_x2apic_icr_irqoff(vcpu, data);
> + if (!handle_fastpath_set_x2apic_icr_irqoff(vcpu, data))
> + ret = EXIT_FASTPATH_SKIP_EMUL_INS;
> + break;
> + case MSR_IA32_TSCDEADLINE:
> + data = kvm_read_edx_eax(vcpu);
> + if (!handle_fastpath_set_tscdeadline(vcpu, data))
> + ret = EXIT_FASTPATH_REENTER_GUEST;
> break;
> default:
> - return EXIT_FASTPATH_NONE;
> + ret = EXIT_FASTPATH_NONE;
> }
>
> - if (!ret) {
> + if (ret != EXIT_FASTPATH_NONE) {
> trace_kvm_msr_write(msr, data);
> - return EXIT_FASTPATH_SKIP_EMUL_INS;
> + if (ret == EXIT_FASTPATH_REENTER_GUEST)
> + kvm_skip_emulated_instruction(vcpu);
> }
>
> - return EXIT_FASTPATH_NONE;
> + return ret;
> }
> EXPORT_SYMBOL_GPL(handle_fastpath_set_msr_irqoff);
>
> --
> 2.7.4
</wanpengli@tencent.com></lihaiwei@tencent.com></lihaiwei@tencent.com></wanpengli@tencent.com></kernellwp@gmail.com>
next prev parent reply other threads:[~2020-04-28 10:05 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-28 6:23 [PATCH v4 0/7] KVM: VMX: Tscdeadline timer " Wanpeng Li
2020-04-28 6:23 ` [PATCH v4 1/7] KVM: VMX: Introduce generic fastpath handler Wanpeng Li
2020-04-30 13:28 ` Vitaly Kuznetsov
2020-05-01 14:11 ` Sean Christopherson
2020-05-01 22:52 ` Wanpeng Li
2020-04-28 6:23 ` [PATCH v4 2/7] KVM: X86: Enable fastpath when APICv is enabled Wanpeng Li
2020-04-30 13:34 ` Vitaly Kuznetsov
2020-05-04 17:06 ` Paolo Bonzini
2020-04-28 6:23 ` [PATCH v4 3/7] KVM: X86: Introduce more exit_fastpath_completion enum values Wanpeng Li
2020-04-28 6:23 ` [PATCH v4 4/7] KVM: X86: Introduce kvm_vcpu_exit_request() helper Wanpeng Li
2020-04-28 6:23 ` [PATCH v4 5/7] KVM: VMX: Optimize posted-interrupt delivery for timer fastpath Wanpeng Li
2020-04-30 13:32 ` Paolo Bonzini
2020-04-30 23:43 ` Wanpeng Li
2020-04-28 6:23 ` [PATCH v4 6/7] KVM: X86: TSCDEADLINE MSR emulation fastpath Wanpeng Li
2020-04-28 9:58 ` 林鑫龙 [this message]
2020-04-28 10:05 ` Wanpeng Li
2020-04-28 6:23 ` [PATCH v4 7/7] KVM: VMX: Handle preemption timer fastpath Wanpeng Li
2020-05-04 17:22 ` [PATCH v4 0/7] KVM: VMX: Tscdeadline timer emulation fastpath Paolo Bonzini
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=15150824.2a36.171c0394538.Coremail.linxl3@wangsu.com \
--to=linxl3@wangsu.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=sean.j.christopherson@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®