All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Radim Krčmář" <rkrcmar@redhat.com>
To: Wanpeng Li <kernellwp@gmail.com>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
	Paolo Bonzini <pbonzini@redhat.com>,
	Yunhong Jiang <yunhong.jiang@intel.com>,
	Wanpeng Li <wanpeng.li@hotmail.com>
Subject: [PATCH 6/5] KVM: x86: fix periodic lapic timer with hrtimers
Date: Mon, 24 Oct 2016 17:03:23 +0200	[thread overview]
Message-ID: <20161024150323.GB2247@potion> (raw)
In-Reply-To: <1477304593-3453-1-git-send-email-wanpeng.li@hotmail.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>
---
 arch/x86/kvm/lapic.c | 38 +++++++++++++-------------------------
 1 file changed, 13 insertions(+), 25 deletions(-)

diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index f4734fe12803..6244988418be 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -1350,19 +1350,19 @@ static void start_sw_tscdeadline(struct kvm_lapic *apic)
 
 static void start_sw_period(struct kvm_lapic *apic)
 {
-	ktime_t now;
-
-	now = apic->lapic_timer.timer.base->get_time();
-
 	if (!apic->lapic_timer.period)
 		return;
 
-	if (likely(ktime_after(apic->lapic_timer.target_expiration, now)))
-		hrtimer_start(&apic->lapic_timer.timer,
-			apic->lapic_timer.target_expiration,
-			HRTIMER_MODE_ABS_PINNED);
-	else
+	if (apic_lvtt_oneshot(apic) &&
+	    ktime_after(apic->lapic_timer.target_expiration,
+	                apic->lapic_timer.timer.base->get_time())) {
 		apic_timer_expired(apic);
+		return;
+	}
+
+	hrtimer_start(&apic->lapic_timer.timer,
+		apic->lapic_timer.target_expiration,
+		HRTIMER_MODE_ABS_PINNED);
 }
 
 static bool set_target_expiration(struct kvm_lapic *apic)
@@ -1414,10 +1414,11 @@ static bool set_target_expiration(struct kvm_lapic *apic)
 
 static void advance_periodic_target_expiration(struct kvm_lapic *apic)
 {
-	apic->lapic_timer.tscdeadline = kvm_read_l1_tsc(apic->vcpu, rdtsc()) +
+	apic->lapic_timer.tscdeadline +=
 		nsec_to_cycles(apic->vcpu, apic->lapic_timer.period);
-	apic->lapic_timer.target_expiration = ktime_add_ns(apic->lapic_timer.timer.base->get_time(),
-		apic->lapic_timer.period);
+	apic->lapic_timer.target_expiration =
+		ktime_add_ns(apic->lapic_timer.target_expiration,
+				apic->lapic_timer.period);
 }
 
 bool kvm_lapic_hv_timer_in_use(struct kvm_vcpu *vcpu)
@@ -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));
-	}
 	start_hv_timer(apic);
 }
 EXPORT_SYMBOL_GPL(kvm_lapic_switch_to_hv_timer);
-- 
2.10.1

  parent reply	other threads:[~2016-10-24 15:03 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 ` Radim Krčmář [this message]
2016-10-24 15:09   ` [PATCH 6/5] KVM: x86: fix periodic lapic timer with hrtimers 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ář

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=20161024150323.GB2247@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.