本文主要是对SDM CPU-based Posted Interrupt做相关补充。对于VT-d的Posted-interrupt,本文并不涉及。

Background

Virtual-Interrupt Delivery利用硬件功能解决了如下两个问题:第一个是需要Hypervisor手动模拟Interrupt Acknowledgement(要先从IRR中取出最高优先级的中断,设置ISR中对应位)、Interrupt Delivery(EOI);第二个是有时需要产生Interrupt Window VM Exit以正确注入中断。

Posted Interrupt是对Virtual-Interrupt Delivery的进一步发展,让我们可以省略Interrupt Acceptance的过程,直接令正在运行的vCPU收到一个虚假中断,而不产生VM Exit。它可以向正在运行的vCPU注入中断,配合VT-d的Posted Interrupt功能,还可以实现Passthrough设备的中断直接发给vCPU而不引起VM Exit。

CPU-based Posted-Interrupt Processing


Usage Examples and Enabling Posted-Interrupt Processing in KVM


Send the event notification:给vCPU所在的CPU发送一个Notification Event,即中断向量号为Posted-Interrupt Notification Vector的中断。

假设现在想给一个正在运行的vCPU注入中断,除非该vCPU正在处理中断,否则仅凭Virtual-Interrupt Delivery,仍需要令其VM Exit并设置RVI,以便在VM Entry时触发Virtual-Interrupt Delivery。若使用Posted Interrupt,则可以设置PIR中对应位,然后给vCPU所在的CPU发送一个Notification Event,即中断向量号为Posted-Interrupt Notification Vector的中断,这样vCPU无需VM Exit就可以被注入一个甚至多个中断。


参考链接:

  1. Intel SDM Chapter 29: APIC Virtualizaton & Virtual Interrupts
  2. Enabling Optimized Interrupt/APIC Virtualization in KVM