通过 VFIO 对分配的设备进行中断处理

Interrupt handling for assigned Device through VFIO

我试图了解中断处理如何通过 VFIO 分配给 VM(来宾 KVM)的设备,但没有得到任何关于它是如何发生的线索?

比方说,我有一个设备通过 VFIO 直接分配(设备直通)给来宾 VM,并且该特定设备会出现硬件中断?

接下来会发生什么?

来自设备的中断被主机内核接收并路由到由 vfio 总线驱动程序、vfio-pci 或 vfio-platform 注册的中断处理程序。该中断处理程序只是将中断中继到用户 (QEMU) 通过 ioctl 配置的 eventfd。使用 KVM 时,用户可以将来自 vfio 的中断信号 eventfd 直接连接到 KVM 中的中断注入 irqfd。这避免了将中断弹回 QEMU 用户空间以注入客户机,尽管如果 KVM irqfd 支持不可用,该路径是一个选项。

对于电平触发的中断,我们还必须屏蔽主机中的中断中断,以防止设备在来宾服务中断时继续中断主机。因此,我们在向 eventfd 发送信号之前屏蔽中断,并使用一个略有不同的 KVM irqfd,称为重采样 irqfd,它注册了第二个 eventfd-irqfd 对,用于向 vfio 发出取消屏蔽信号。

各种硬件技术对此进行了增强以提高效率。在某些情况下,英特尔 APICv 允许在没有 vmexit 的情况下将中断直接注入客户机。这完全在 KVM 中处理。当正确的 vCPU 在接收硬件中断的处理器上 运行 时,Intel Posted Interrupts 将允许中断完全绕过主机。 ARM IRQ 转发允许客户机管理中断的取消屏蔽,避免重采样 irqfd 开销。