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

时间:2015-04-05 19:48:20

标签: arm linux-device-driver kvm interrupt-handling vfio

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

让我们说,我有一个设备直接通过VFIO分配给设备直通(设备直通),并为该特定设备提供硬件中断?

接下来会发生什么?

1 个答案:

答案 0 :(得分:7)

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

对于电平触发的中断,我们还必须屏蔽主机中的中断中断,以防止器件在客户机处理中断时继续中断主机。因此,我们在发出eventfd信号之前屏蔽中断,并使用稍微不同的KVM irqfd,称为重新采样irqfd,它注册第二个eventfd-irqfd对,用于发信号通知从KVM到vfio的unmask。

各种硬件技术增强了这一点,以提高效率。在某些情况下,Intel APICv允许在没有vmexit的情况下将中断直接注入到guest虚拟机中。这完全在KVM中处理。英特尔发布的中断将允许中断在接收硬件中断的处理器上运行正确的vCPU时完全绕过主机。 ARM IRQ Forwarding允许guest虚拟机管理中断的屏蔽,避免重新采样irqfd开销。