Michael S. Tsirkin
ab9cf4996b
KVM guest: guest side for eoi avoidance
The idea is simple: there's a bit, per APIC, in guest memory,
that tells the guest that it does not need EOI.
Guest tests it using a single est and clear operation - this is
necessary so that host can detect interrupt nesting - and if set, it can
skip the EOI MSR.
I run a simple microbenchmark to show exit reduction
(note: for testing, need to apply follow-up patch
'kvm: host side for eoi optimization' + a qemu patch
I posted separately, on host):
Before:
Performance counter stats for 'sleep 1s':
47,357 kvm:kvm_entry [99.98%]
0 kvm:kvm_hypercall [99.98%]
0 kvm:kvm_hv_hypercall [99.98%]
5,001 kvm:kvm_pio [99.98%]
0 kvm:kvm_cpuid [99.98%]
22,124 kvm:kvm_apic [99.98%]
49,849 kvm:kvm_exit [99.98%]
21,115 kvm:kvm_inj_virq [99.98%]
0 kvm:kvm_inj_exception [99.98%]
0 kvm:kvm_page_fault [99.98%]
22,937 kvm:kvm_msr [99.98%]
0 kvm:kvm_cr [99.98%]
0 kvm:kvm_pic_set_irq [99.98%]
0 kvm:kvm_apic_ipi [99.98%]
22,207 kvm:kvm_apic_accept_irq [99.98%]
22,421 kvm:kvm_eoi [99.98%]
0 kvm:kvm_pv_eoi [99.99%]
0 kvm:kvm_nested_vmrun [99.99%]
0 kvm:kvm_nested_intercepts [99.99%]
0 kvm:kvm_nested_vmexit [99.99%]
0 kvm:kvm_nested_vmexit_inject [99.99%]
0 kvm:kvm_nested_intr_vmexit [99.99%]
0 kvm:kvm_invlpga [99.99%]
0 kvm:kvm_skinit [99.99%]
57 kvm:kvm_emulate_insn [99.99%]
0 kvm:vcpu_match_mmio [99.99%]
0 kvm:kvm_userspace_exit [99.99%]
2 kvm:kvm_set_irq [99.99%]
2 kvm:kvm_ioapic_set_irq [99.99%]
23,609 kvm:kvm_msi_set_irq [99.99%]
1 kvm:kvm_ack_irq [99.99%]
131 kvm:kvm_mmio [99.99%]
226 kvm:kvm_fpu [100.00%]
0 kvm:kvm_age_page [100.00%]
0 kvm:kvm_try_async_get_page [100.00%]
0 kvm:kvm_async_pf_doublefault [100.00%]
0 kvm:kvm_async_pf_not_present [100.00%]
0 kvm:kvm_async_pf_ready [100.00%]
0 kvm:kvm_async_pf_completed
1.002100578 seconds time elapsed
After:
Performance counter stats for 'sleep 1s':
28,354 kvm:kvm_entry [99.98%]
0 kvm:kvm_hypercall [99.98%]
0 kvm:kvm_hv_hypercall [99.98%]
1,347 kvm:kvm_pio [99.98%]
0 kvm:kvm_cpuid [99.98%]
1,931 kvm:kvm_apic [99.98%]
29,595 kvm:kvm_exit [99.98%]
24,884 kvm:kvm_inj_virq [99.98%]
0 kvm:kvm_inj_exception [99.98%]
0 kvm:kvm_page_fault [99.98%]
1,986 kvm:kvm_msr [99.98%]
0 kvm:kvm_cr [99.98%]
0 kvm:kvm_pic_set_irq [99.98%]
0 kvm:kvm_apic_ipi [99.99%]
25,953 kvm:kvm_apic_accept_irq [99.99%]
26,132 kvm:kvm_eoi [99.99%]
26,593 kvm:kvm_pv_eoi [99.99%]
0 kvm:kvm_nested_vmrun [99.99%]
0 kvm:kvm_nested_intercepts [99.99%]
0 kvm:kvm_nested_vmexit [99.99%]
0 kvm:kvm_nested_vmexit_inject [99.99%]
0 kvm:kvm_nested_intr_vmexit [99.99%]
0 kvm:kvm_invlpga [99.99%]
0 kvm:kvm_skinit [99.99%]
284 kvm:kvm_emulate_insn [99.99%]
68 kvm:vcpu_match_mmio [99.99%]
68 kvm:kvm_userspace_exit [99.99%]
2 kvm:kvm_set_irq [99.99%]
2 kvm:kvm_ioapic_set_irq [99.99%]
28,288 kvm:kvm_msi_set_irq [99.99%]
1 kvm:kvm_ack_irq [99.99%]
131 kvm:kvm_mmio [100.00%]
588 kvm:kvm_fpu [100.00%]
0 kvm:kvm_age_page [100.00%]
0 kvm:kvm_try_async_get_page [100.00%]
0 kvm:kvm_async_pf_doublefault [100.00%]
0 kvm:kvm_async_pf_not_present [100.00%]
0 kvm:kvm_async_pf_ready [100.00%]
0 kvm:kvm_async_pf_completed
1.002039622 seconds time elapsed
We see that # of exits is almost halved.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
2012-06-25 12:38:06 +03:00
..
2012-05-29 20:14:53 -07:00
2012-05-23 17:12:06 -07:00
2012-06-01 15:55:31 -07:00
2011-11-14 13:05:15 +01:00
2012-03-28 16:36:31 +02:00
2012-01-11 18:50:26 -08:00
2011-07-23 10:34:47 -07:00
2011-07-14 11:47:53 -07:00
2012-05-08 12:35:06 +02:00
2011-11-17 13:35:37 -08:00
2012-02-20 12:52:06 -08:00
2011-12-12 14:26:10 -08:00
2012-05-15 15:36:41 -07:00
2012-03-28 18:11:12 +01:00
2012-03-20 21:48:15 +08:00
2011-03-23 19:47:19 -07:00
2011-10-10 06:56:57 +02:00
2012-02-23 14:37:47 -07:00
2012-05-09 11:44:42 +02:00
2012-05-09 11:44:42 +02:00
2012-05-23 10:09:50 -07:00
2012-05-29 16:22:20 -07:00
2012-01-11 19:13:40 -08:00
2011-03-16 14:03:32 +01:00
2012-06-01 13:01:51 -04:00
2012-05-31 23:12:22 -04:00
2012-05-31 23:12:19 -04:00
2012-05-08 11:46:05 -07:00
2012-05-08 11:46:05 -07:00
2012-05-29 20:14:53 -07:00
2012-05-29 20:14:53 -07:00
2011-07-14 11:47:53 -07:00
2012-05-25 15:32:29 +02:00
2010-12-30 12:20:28 +01:00
2012-05-14 14:15:31 -07:00
2011-03-23 22:15:54 +01:00
2011-07-01 10:37:14 +02:00
2012-03-28 18:11:12 +01:00
2011-02-17 14:59:22 +01:00
2012-05-08 14:08:44 +02:00
2011-12-07 09:27:11 +01:00
2010-10-18 19:58:50 +02:00
2012-03-29 15:28:47 +02:00
2012-03-29 18:21:35 -07:00
2011-12-06 20:41:02 +01:00
2012-04-05 15:25:50 -07:00
2012-04-04 17:26:08 -07:00
2012-03-06 09:49:49 +01:00
2012-03-06 09:49:49 +01:00
2012-05-09 11:44:42 +02:00
2012-06-25 12:38:06 +03:00
2012-04-08 12:49:54 +03:00
2012-03-28 18:11:12 +01:00
2012-03-28 18:11:12 +01:00
2010-09-22 15:36:49 -07:00
2012-05-29 20:14:53 -07:00
2012-04-13 11:51:05 +02:00
2012-05-07 11:36:49 -07:00
2012-05-07 14:37:14 +02:00
2010-11-18 13:41:35 +01:00
2012-03-28 18:11:12 +01:00
2012-05-29 20:14:53 -07:00
2012-03-28 18:11:12 +01:00
2012-05-23 10:21:19 -07:00
2012-05-31 23:12:20 -04:00
2012-05-14 14:15:31 -07:00
2012-05-23 10:09:50 -07:00
2012-05-21 15:09:38 +02:00
2011-05-10 10:21:35 +02:00
2012-05-21 15:09:38 +02:00
2012-03-28 16:36:31 +02:00
2012-03-08 10:57:35 +01:00
2012-05-23 10:59:07 -07:00
2012-05-23 10:59:07 -07:00
2012-05-23 10:59:07 -07:00
2012-06-01 13:54:21 -07:00
2010-11-28 09:33:20 +01:00
2011-12-05 18:13:11 +01:00
2010-11-12 00:45:41 +01:00
2012-05-29 20:14:53 -07:00
2011-07-21 11:19:28 +02:00
2011-07-21 11:19:28 +02:00
2010-12-17 10:01:30 -08:00
2011-12-05 17:09:21 +01:00
2012-05-08 09:42:18 -07:00
2012-05-29 20:14:53 -07:00
2012-06-01 13:01:51 -04:00
2012-05-14 11:49:38 +02:00
2012-05-29 20:14:53 -07:00
2011-06-14 22:48:51 -04:00
2011-08-04 16:13:49 -07:00
2010-09-03 08:16:02 +02:00
2012-03-29 18:12:23 -07:00
2011-11-18 16:25:07 -08:00
2012-02-20 12:52:06 -08:00
2012-05-08 15:04:27 -07:00
2012-03-28 18:11:12 +01:00
2011-05-21 19:10:33 +02:00
2012-04-20 13:51:38 -07:00
2012-05-17 19:06:13 -04:00
2012-03-29 14:28:26 -07:00
2011-10-31 19:30:35 -04:00
2012-05-31 23:12:17 -04:00
2012-02-22 11:49:40 +01:00
2012-03-29 14:16:48 -07:00
2012-03-14 07:41:36 +01:00
2011-03-18 10:39:30 +01:00
2012-03-29 18:21:35 -07:00
2012-05-08 11:46:05 -07:00
2012-05-14 14:42:33 +02:00
2012-04-06 11:49:59 +02:00
2011-08-10 19:26:46 -05:00
2011-08-04 16:13:53 -07:00
2012-05-01 14:50:09 -04:00
2011-01-25 16:58:39 -08:00
2012-05-16 15:17:17 -07:00