From patchwork Wed Aug 27 14:05:19 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Wei W" X-Patchwork-Id: 4786261 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 610EA9F37E for ; Wed, 27 Aug 2014 05:41:42 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 84FDD2015E for ; Wed, 27 Aug 2014 05:41:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 747472014A for ; Wed, 27 Aug 2014 05:41:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932525AbaH0Flb (ORCPT ); Wed, 27 Aug 2014 01:41:31 -0400 Received: from mga02.intel.com ([134.134.136.20]:4732 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932340AbaH0Flb (ORCPT ); Wed, 27 Aug 2014 01:41:31 -0400 Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga101.jf.intel.com with ESMTP; 26 Aug 2014 22:41:30 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.04,408,1406617200"; d="scan'208";a="563971918" Received: from unknown (HELO otc.sh.intel.com) ([10.239.48.14]) by orsmga001.jf.intel.com with ESMTP; 26 Aug 2014 22:41:13 -0700 From: Wei Wang To: kvm@vger.kernel.org Cc: pbonzini@redhat.com, alex.williamson@redhat.com, Wei Wang , Yang Zhang Subject: [PATCH v2] KVM: x86: sync old tmr with ioapic to update Date: Wed, 27 Aug 2014 22:05:19 +0800 Message-Id: <1409148319-5933-1-git-send-email-wei.w.wang@intel.com> X-Mailer: git-send-email 1.7.1 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Spam-Status: No, score=-5.0 required=5.0 tests=BAYES_00, DATE_IN_FUTURE_06_12, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP kvm_ioapic_scan_entry() needs to update tmr. The previous lapic tmr value (old_tmr) needs to sync with ioapic to get an accurate updated tmr value before the updating work. Tested-by: Rongrong Liu Signed-off-by: Yang Zhang Signed-off-by: Wei Wang --- arch/x86/kvm/lapic.c | 19 +++++++++++++++++-- arch/x86/kvm/x86.c | 2 +- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 08e8a89..8c1162d 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -518,10 +518,25 @@ static void pv_eoi_clr_pending(struct kvm_vcpu *vcpu) void kvm_apic_update_tmr(struct kvm_vcpu *vcpu, u32 *tmr) { struct kvm_lapic *apic = vcpu->arch.apic; + u32 irr; + u32 isr; + u32 old_tmr, new_tmr; int i; - for (i = 0; i < 8; i++) - apic_set_reg(apic, APIC_TMR + 0x10 * i, tmr[i]); + /* + * The updated tmr value comes from level-triggerd interrupts that + * have already been delieverd to lapic and new coming ones which + * are pending in ioapic. According to the x86 spec, tmr is valid + * when irr or isr is set. + */ + for (i = 0; i < 8; i++) { + irr = kvm_apic_get_reg(apic, APIC_IRR + 0x10 * i); + isr = kvm_apic_get_reg(apic, APIC_ISR + 0x10 * i); + old_tmr = kvm_apic_get_reg(apic, APIC_TMR + 0x10 * i); + new_tmr = (~(irr | isr) & tmr[i]) + | ((irr | isr) & old_tmr); + apic_set_reg(apic, APIC_TMR + 0x10 * i, new_tmr); + } } static void apic_update_ppr(struct kvm_lapic *apic) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 5f5edb6..d401684 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -5991,8 +5991,8 @@ static void vcpu_scan_ioapic(struct kvm_vcpu *vcpu) memset(tmr, 0, 32); kvm_ioapic_scan_entry(vcpu, eoi_exit_bitmap, tmr); - kvm_x86_ops->load_eoi_exitmap(vcpu, eoi_exit_bitmap); kvm_apic_update_tmr(vcpu, tmr); + kvm_x86_ops->load_eoi_exitmap(vcpu, eoi_exit_bitmap); } /*