一、 什么是IPI Virtualization
当前,在虚拟机内部发送IPI中断,是通过模拟写local apic的ICR寄存器实现的,后端截获这个写并模拟相关的中断。这种方式会导致vCPU产生vm-exit,vm-exit的开销会影响性能,特别是对IPI敏感的任务。
IPI virtualization是VT-x的一个新特性,目标是消除IPI场景下vCPU的VM-exits。使能了IPI virtualization,处理器模拟以下类型的APIC寄存器写而不会产生VM-exits:
- Memory-mapped ICR writes
- MSR-mapped ICR writes
- SENDUIPI execution
Posted Interrupt解决的是接收端vCPU退出的问题,而IPI virtualization解决的是发送端vCPU退出的问题。
IPI virtualization is a new VT-x feature, targeting to eliminate VM-exits on source vCPUs when issuing unicast, physical-addressing IPIs.
从实际的测试结果来看,multicast IPIs会产生APIC write类型的VM-exits(guest使用x2apic模式),与红色部分一致。
二、 IPI Virtualization实现原理
(一) VMCS与相关数据结构变化
IPI virtualization特性,在VMCS中引入了两个主要的变化:新的VM-execution contral与新的数据结构(PID-pointer table)
如下图所示,展示了vmcs相关数据结构的变化:
1. VM-executon的变化
定义tertiary processor-based VM-execution controls的bit[4]为IPI virtualization使能位。
2. PID-Pointer Table
当VM-execution control中“IPI virtualization”为1时,处理器使用PID-pointer Table进行IPI虚拟化。
在此table中,第一个entry包含一个PID的物理地址(64 bits)。
- 这个地址必须64-byes对齐。
- bit[0]为valid位;bit[5:1]为reserved,必须为0。
- PID-pointer table最多有216–1 entries
- PID-pointer table中的索引,对应vCPU的APIC ID
VMM通过VMCS中的以下域配置PID-pointer table:
- PID-pointer table address: PID-pointer table的物理地址,64位。VMCS的编码为00002042H(在64位模式下为整个64位,在32传统模式下为低32位), 00002043H(高32位)。示例:
PID_POINTER_TABLE = 0x00002042,
vmcs_write64(PID_POINTER_TABLE, __pa(kvm_vmx->pid_table));
- Last PID-pointer index: 16位,VMCS编码为00000008H,指定了PID-pointer table中最后一个entry的索引。
注:只有在支持IPI虚拟化的处理器上才存在以上数据结构。
(二) IPI Virtualization的流程
IPI虚拟化,用到两个关键的数据:8位的虚拟中断向量,用V表示 32位的虚拟APIC ID 用T表示。
以下流程是由硬件自动完成,软件不参与。