• Chao Gao's avatar
    KVM: VMX: enable IPI virtualization · d588bb9b
    Chao Gao authored
    With IPI virtualization enabled, the processor emulates writes to
    APIC registers that would send IPIs. The processor sets the bit
    corresponding to the vector in target vCPU's PIR and may send a
    notification (IPI) specified by NDST and NV fields in target vCPU's
    Posted-Interrupt Descriptor (PID). It is similar to what IOMMU
    engine does when dealing with posted interrupt from devices.
    
    A PID-pointer table is used by the processor to locate the PID of a
    vCPU with the vCPU's APIC ID. The table size depends on maximum APIC
    ID assigned for current VM session from userspace. Allocating memory
    for PID-pointer table is deferred to vCPU creation, because irqchip
    mode and VM-scope maximum APIC ID is settled at that point. KVM can
    skip PID-pointer table allocation if !irqchip_in_kernel().
    
    Like VT-d PI, if a vCPU goes to blocked state, VMM needs to switch its
    notification vector to wakeup vector. This can ensure that when an IPI
    for blocked vCPUs arrives, VMM can get control and wake up blocked
    vCPUs. And if a VCPU is preempted, its posted interrupt notification
    is suppressed.
    
    Note that IPI virtualization can only virualize physical-addressing,
    flat mode, unicast IPIs. Sending other IPIs would still cause a
    trap-like APIC-write VM-exit and need to be handled by VMM.
    Signed-off-by: default avatarChao Gao <chao.gao@intel.com>
    Signed-off-by: default avatarZeng Guang <guang.zeng@intel.com>
    Message-Id: <20220419154510.11938-1-guang.zeng@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    d588bb9b
kvm_host.h 60.5 KB