From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: [PATCH] KVM: x86: Clear apic tsc-deadline after deadline Date: Tue, 19 Aug 2014 12:36:31 +0200 Message-ID: <53F328AF.3050802@redhat.com> References: <1408390933-2876-1-git-send-email-namit@cs.technion.ac.il> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org To: Nadav Amit , gleb@kernel.org Return-path: Received: from mail-wg0-f52.google.com ([74.125.82.52]:56249 "EHLO mail-wg0-f52.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750779AbaHSKgf (ORCPT ); Tue, 19 Aug 2014 06:36:35 -0400 Received: by mail-wg0-f52.google.com with SMTP id a1so6075763wgh.11 for ; Tue, 19 Aug 2014 03:36:34 -0700 (PDT) In-Reply-To: <1408390933-2876-1-git-send-email-namit@cs.technion.ac.il> Sender: kvm-owner@vger.kernel.org List-ID: Il 18/08/2014 21:42, Nadav Amit ha scritto: > Intel SDM 10.5.4.1 says "When the timer generates an interrupt, it disarms > itself and clears the IA32_TSC_DEADLINE MSR". > > This patch clears the MSR upon timer interrupt delivery which delivered on > deadline mode. Since the MSR may be reconfigured while an interrupt is > pending, causing the new value to be overriden, pending timer interrupts are > checked before setting a new deadline. > > Signed-off-by: Nadav Amit > --- > arch/x86/kvm/lapic.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c > index 08e8a89..666c086 100644 > --- a/arch/x86/kvm/lapic.c > +++ b/arch/x86/kvm/lapic.c > @@ -1352,6 +1352,9 @@ void kvm_set_lapic_tscdeadline_msr(struct kvm_vcpu *vcpu, u64 data) > return; > > hrtimer_cancel(&apic->lapic_timer.timer); > + /* Inject here so clearing tscdeadline won't override new value */ > + if (apic_has_pending_timer(vcpu)) > + kvm_inject_apic_timer_irqs(vcpu); > apic->lapic_timer.tscdeadline = data; > start_apic_timer(apic); > } > @@ -1639,6 +1642,8 @@ void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu) > > if (atomic_read(&apic->lapic_timer.pending) > 0) { > kvm_apic_local_deliver(apic, APIC_LVTT); > + if (apic_lvtt_tscdeadline(apic)) > + apic->lapic_timer.tscdeadline = 0; > atomic_set(&apic->lapic_timer.pending, 0); > } > } > Applied, thanks. Also applied patch 2 to kvm-unit-tests. Paolo