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

[Xen-changelog] [xen-unstable] x86 vmx: Accelerate VLAPIC EOI writes



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1249477366 -3600
# Node ID 194c2be92084631e660e8bcd34cc7cda5d7de87b
# Parent  cd46b418d1719fa8654b5355ffe1f675de99549f
x86 vmx: Accelerate VLAPIC EOI writes

Our testing indicates that most apic accesses are eoi writes. This
patch accelerate guest EOI emulation utilizing HW VM Exit
information.

Without this patch, xentrace shows the apci access average tsc costs
is ~7.8k in our case and it down to ~3k with it. We also save 3% cpu
in our case.

From: Yang Zhang <yang.zhang@xxxxxxxxx>
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/hvm/vmx/vmx.c |   26 +++++++++++++++++++++++++-
 1 files changed, 25 insertions(+), 1 deletion(-)

diff -r cd46b418d171 -r 194c2be92084 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c        Wed Aug 05 13:50:36 2009 +0100
+++ b/xen/arch/x86/hvm/vmx/vmx.c        Wed Aug 05 14:02:46 2009 +0100
@@ -2270,6 +2270,26 @@ static void vmx_vmexit_ud_intercept(stru
     }
 }
 
+static int vmx_handle_eoi_write(void)
+{
+    unsigned long exit_qualification = __vmread(EXIT_QUALIFICATION);
+
+    /*
+     * 1. Must be a linear access data write.
+     * 2. Data write must be to the EOI register.
+     */
+    if ( (((exit_qualification >> 12) & 0xf) == 1) &&
+         ((exit_qualification & 0xfff) == APIC_EOI) )
+    {
+        int inst_len = __get_instruction_length(); /* Safe: APIC data write */
+        __update_guest_eip(inst_len);
+        vlapic_EOI_set(vcpu_vlapic(current));
+        return 1;
+    }
+
+    return 0;
+}
+
 asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs)
 {
     unsigned int exit_reason, idtv_info;
@@ -2572,8 +2592,12 @@ asmlinkage void vmx_vmexit_handler(struc
     case EXIT_REASON_TPR_BELOW_THRESHOLD:
         break;
 
+    case EXIT_REASON_APIC_ACCESS:
+        if ( !vmx_handle_eoi_write() && !handle_mmio() )
+            vmx_inject_hw_exception(TRAP_gp_fault, 0);
+        break;
+
     case EXIT_REASON_IO_INSTRUCTION:
-    case EXIT_REASON_APIC_ACCESS:
         if ( !handle_mmio() )
             vmx_inject_hw_exception(TRAP_gp_fault, 0);
         break;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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