KVM: host side for eoi optimization
Implementation of PV EOI using shared memory. This reduces the number of exits an interrupt causes as much as by half. The idea is simple: there's a bit, per APIC, in guest memory, that tells the guest that it does not need EOI. We set it before injecting an interrupt and clear before injecting a nested one. Guest tests it using a test and clear operation - this is necessary so that host can detect interrupt nesting - and if set, it can skip the EOI MSR. There's a new MSR to set the address of said register in guest memory. Otherwise not much changed: - Guest EOI is not required - Register is tested & ISR is automatically cleared on exit For testing results see description of previous patch 'kvm_para: guest side for eoi avoidance'. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:

committed by
Avi Kivity

parent
d905c06935
commit
ae7a2a3fb6
@@ -175,6 +175,13 @@ enum {
|
||||
|
||||
/* apic attention bits */
|
||||
#define KVM_APIC_CHECK_VAPIC 0
|
||||
/*
|
||||
* The following bit is set with PV-EOI, unset on EOI.
|
||||
* We detect PV-EOI changes by guest by comparing
|
||||
* this bit with PV-EOI in guest memory.
|
||||
* See the implementation in apic_update_pv_eoi.
|
||||
*/
|
||||
#define KVM_APIC_PV_EOI_PENDING 1
|
||||
|
||||
/*
|
||||
* We don't want allocation failures within the mmu code, so we preallocate
|
||||
@@ -484,6 +491,11 @@ struct kvm_vcpu_arch {
|
||||
u64 length;
|
||||
u64 status;
|
||||
} osvw;
|
||||
|
||||
struct {
|
||||
u64 msr_val;
|
||||
struct gfn_to_hva_cache data;
|
||||
} pv_eoi;
|
||||
};
|
||||
|
||||
struct kvm_lpage_info {
|
||||
|
Reference in New Issue
Block a user