We find mostly apci access is eoi write. 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.
Here is the data
|
CPU%
|
cycles per APIC
access VMEXIT
|
Times per second
|
CPU% for APIC Access
VMEXIT handle
|
default
|
94.46%
|
7805
|
75424
|
5.52%
|
w/ VEOI
|
91.14%
|
3179
|
76474
|
2.28%
|
Default – w/ VEOI
|
3.33%
|
|
|
3.24%
|
diff -r 8af26fef898c
xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c Fri
Jul 24 12:08:54 2009 +0100
+++ b/xen/arch/x86/hvm/vmx/vmx.c Tue
Jul 28 15:07:07 2009 +0800
@@ -2270,6 +2270,25 @@
}
}
+static int vmx_handle_eoi_write(void)
+{
+ struct vcpu *curr =
current;
+ unsigned long
exit_qualification;
+ unsigned long offset;
+ struct vlapic *vlapic =
vcpu_vlapic(curr);
+
+ exit_qualification =
__vmread(EXIT_QUALIFICATION);
+ offset =
exit_qualification & 0xfff;
+
+ if (
((exit_qualification >> 12) & 0xf) == 1 && offset == APIC_EOI
)
+ {
+
/* EOI write */
+
vlapic_EOI_set(vlapic);
+
return 1;
+ }
+ return 0;
+}
+
asmlinkage void
vmx_vmexit_handler(struct cpu_user_regs *regs)
{
unsigned int
exit_reason, idtv_info;
@@ -2571,9 +2590,15 @@
case
EXIT_REASON_TPR_BELOW_THRESHOLD:
break;
-
+ case EXIT_REASON_APIC_ACCESS:
+
if ( vmx_handle_eoi_write() )
+
{
+
/* For EOI wirte, skip emulate it */
+
inst_len = __get_instruction_length();
+
__update_guest_eip(inst_len);
+
break;
+
}
case
EXIT_REASON_IO_INSTRUCTION:
- case
EXIT_REASON_APIC_ACCESS:
if ( !handle_mmio() )
vmx_inject_hw_exception(TRAP_gp_fault, 0);
break;