[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen master] x86/apicv: fix RTC periodic timer and apicv issue



commit c7bdecae42c4737b3cbdc506343aa85fc44edcfa
Author:     Quan Xu <xuquan8@xxxxxxxxxx>
AuthorDate: Thu Jan 5 11:10:01 2017 +0100
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Thu Jan 5 11:10:01 2017 +0100

    x86/apicv: fix RTC periodic timer and apicv issue
    
    When Xen apicv is enabled, wall clock time is faster on Windows7-32
    guest with high payload (with 2vCPU, captured from xentrace, in
    high payload, the count of IPI interrupt increases rapidly between
    these vCPUs).
    
    If IPI intrrupt (vector 0xe1) and periodic timer interrupt (vector 0xd1)
    are both pending (index of bit set in vIRR), unfortunately, the IPI
    intrrupt is high priority than periodic timer interrupt. Xen updates
    IPI interrupt bit set in vIRR to guest interrupt status (RVI) as a high
    priority and apicv (Virtual-Interrupt Delivery) delivers IPI interrupt
    within VMX non-root operation without a VM-Exit. Within VMX non-root
    operation, if periodic timer interrupt index of bit is set in vIRR and
    highest, the apicv delivers periodic timer interrupt within VMX non-root
    operation as well.
    
    But in current code, if Xen doesn't update periodic timer interrupt bit
    set in vIRR to guest interrupt status (RVI) directly, Xen is not aware
    of this case to decrease the count (pending_intr_nr) of pending periodic
    timer interrupt, then Xen will deliver a periodic timer interrupt again.
    
    And that we update periodic timer interrupt in every VM-entry, there is
    a chance that already-injected instance (before EOI-induced exit happens)
    will incur another pending IRR setting if there is a VM-exit happens
    between virtual interrupt injection (vIRR->0, vISR->1) and EOI-induced
    exit (vISR->0), since pt_intr_post hasn't been invoked yet, then the
    guest receives more periodic timer interrupt.
    
    So we set eoi_exit_bitmap for intack.vector - give a chance to post
    periodic time interrupts when periodic time interrupts become the
    highest one.
    
    Signed-off-by: Quan Xu <xuquan8@xxxxxxxxxx>
    Acked-by: Kevin Tian <kevin.tian@xxxxxxxxx>
    Tested-by: Chao Gao <chao.gao@xxxxxxxxx>
---
 xen/arch/x86/hvm/vmx/intr.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/xen/arch/x86/hvm/vmx/intr.c b/xen/arch/x86/hvm/vmx/intr.c
index 639a705..24e4505 100644
--- a/xen/arch/x86/hvm/vmx/intr.c
+++ b/xen/arch/x86/hvm/vmx/intr.c
@@ -312,12 +312,15 @@ void vmx_intr_assist(void)
         unsigned int i, n;
 
        /*
-        * Set eoi_exit_bitmap for periodic timer interrup to cause EOI-induced 
VM
-        * exit, then pending periodic time interrups have the chance to be 
injected
-        * for compensation
+        * intack.vector is the highest priority vector. So we set 
eoi_exit_bitmap
+        * for intack.vector - give a chance to post periodic time interrupts 
when
+        * periodic time interrupts become the highest one
         */
-        if (pt_vector != -1)
-            vmx_set_eoi_exit_bitmap(v, pt_vector);
+        if ( pt_vector != -1 )
+        {
+            ASSERT(intack.vector >= pt_vector);
+            vmx_set_eoi_exit_bitmap(v, intack.vector);
+        }
 
         /* we need update the RVI field */
         __vmread(GUEST_INTR_STATUS, &status);
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.