我试图了解中断处理如何通过 VFIO 分配给 VM(来宾 KVM)的设备工作,但对它是如何发生的没有任何线索?
比方说,我有一个设备通过 VFIO 直接分配(设备直通)给来宾 VM,并且该特定设备出现硬件中断?
接下来发生什么?
我试图了解中断处理如何通过 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 对,用于从 KVM 向 vfio 发出取消屏蔽信号。
各种硬件技术增强了这一点,以提高效率。在某些情况下,英特尔 APICv 允许在没有 vmexit 的情况下将中断直接注入来宾。这完全在 KVM 中处理。当正确的 vCPU 在接收硬件中断的处理器上运行时,Intel Posted Interrupts 将允许中断完全绕过主机。ARM IRQ Forwarding 允许来宾管理中断的取消屏蔽,避免重新采样 irqfd 开销。