All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Radim Krčmář" <rkrcmar@redhat.com>
To: Wanpeng Li <wanpeng.li@hotmail.com>
Cc: Wanpeng Li <kernellwp@gmail.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Yunhong Jiang <yunhong.jiang@intel.com>
Subject: Re: [PATCH 6/5] KVM: x86: fix periodic lapic timer with hrtimers
Date: Tue, 25 Oct 2016 15:03:56 +0200	[thread overview]
Message-ID: <20161025130356.GF2247@potion> (raw)
In-Reply-To: <SG2PR02MB1550E0FF04F2614BE0E262BC80A80@SG2PR02MB1550.apcprd02.prod.outlook.com>

2016-10-25 12:48+0000, Wanpeng Li:
>> 在 2016年10月24日,下午11:03,Radim Krčmář <rkrcmar@redhat.com> 写道:
>> 
>> I have only compile-tested it, but it should optimize the switch and
>> also fix two bugs.  The first one is major.
>> This needs that the deadline clearing in [5/5] is fixed.
>> ---8<---
>> We must start the hrimer even if the expiration is already in the past,
>> otherwise the periodic timer would not rearm the hrtimer.
>> 
>> And computing next expiration of a period timer does not require current
>> time.  The period should be constant, so it is more precise to add the
>> period to the last expiration time.  This fixes a time difference
>> between hrtimer expiration and apic->lapic_timer.target_expiration.
>> 
>> Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
>> ---
>> diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
>> @@ -1481,19 +1482,6 @@ void kvm_lapic_switch_to_hv_timer(struct kvm_vcpu *vcpu)
>> 
>>    WARN_ON(apic->lapic_timer.hv_timer_in_use);
>> 
>> -    if (apic_lvtt_period(apic)) {
>> -        ktime_t remaining, now;
>> -        u64 tscl = rdtsc();
>> -
>> -        now = apic->lapic_timer.timer.base->get_time();
>> -        remaining = hrtimer_get_remaining(&apic->lapic_timer.timer);
>> -        if (ktime_to_ns(remaining) < 0)
>> -            remaining = ktime_set(0, 0);
>> -
>> -        apic->lapic_timer.tscdeadline = kvm_read_l1_tsc(apic->vcpu, tscl) +
>> -            nsec_to_cycles(apic->vcpu, ktime_to_ns(remaining));
>> -        apic->lapic_timer.target_expiration = ktime_add_ns(now, ktime_to_ns(remaining));
>> -    }
> 
> Why you remove this? 

We computed those values in advance_periodic_target_expiration() and can
re-use them here.

hrtimer expiration == apic->lapic_timer.target_expiration.  (Otherwise
we're doing something wrong.) If that holds then the code does

  target_expiration = now + (target_expiration - now)

Which can be optimized to 

  target_expiration = target_expiration

and to nothing.  The same principle holds for
apic->lapic_timer.tscdeadline as well.

In other words: It doesn't matter if the timer switches between hrtimer
and VMX deadline -- the target expiration is still the same.

This hunk only added imprecision, because kvm_read_l1_tsc() and
ktime_to_ns() were not using the same time for computation.

      parent reply	other threads:[~2016-10-25 13:04 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-24 10:23 [PATCH v3 0/5] KVM: LAPIC: Add APIC Timer periodic/oneshot mode VMX preemption timer support Wanpeng Li
2016-10-24 10:23 ` [PATCH v3 1/5] KVM: LAPIC: extract start_sw_period() to handle periodic/oneshot mode Wanpeng Li
2016-10-24 10:23 ` [PATCH v3 2/5] KVM: LAPIC: guarantee the timer is in tsc-deadline mode Wanpeng Li
2016-10-24 10:23 ` [PATCH v3 3/5] KVM: LAPIC: introduce kvm_get_lapic_target_expiration_tsc() Wanpeng Li
2016-10-24 10:23 ` [PATCH v3 4/5] KVM: LAPIC: rename start/cancel_hv_tscdeadline to start/cancel_hv_timer Wanpeng Li
2016-10-24 10:23 ` [PATCH v3 5/5] KVM: LAPIC: add APIC Timer periodic/oneshot mode VMX preemption timer support Wanpeng Li
2016-10-24 14:50   ` Radim Krčmář
2016-10-24 23:33     ` Wanpeng Li
2016-10-24 15:03 ` [PATCH 6/5] KVM: x86: fix periodic lapic timer with hrtimers Radim Krčmář
2016-10-24 15:09   ` Paolo Bonzini
2016-10-24 15:27     ` Radim Krčmář
2016-10-24 23:39       ` Wanpeng Li
2016-10-25 11:43         ` Radim Krčmář
2016-10-25 11:55           ` Paolo Bonzini
2016-10-26  6:02           ` Wanpeng Li
2016-10-26  6:08             ` Wanpeng Li
2016-10-26 14:01               ` Radim Krčmář
2016-10-27  2:33                 ` Wanpeng Li
2016-10-26 13:32             ` Radim Krčmář
2016-10-27  2:11               ` Wanpeng Li
2016-10-26 10:23           ` Wanpeng Li
2016-10-26 11:15             ` Paolo Bonzini
2016-10-26 11:26               ` Wanpeng Li
     [not found]   ` <SG2PR02MB1550E0FF04F2614BE0E262BC80A80@SG2PR02MB1550.apcprd02.prod.outlook.com>
2016-10-25 13:03     ` Radim Krčmář [this message]

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=20161025130356.GF2247@potion \
    --to=rkrcmar@redhat.com \
    --cc=kernellwp@gmail.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=wanpeng.li@hotmail.com \
    --cc=yunhong.jiang@intel.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.