Ami*_*mar 3 arm kvm linux-device-driver interrupt-handling vfio
我试图了解通过VFIO分配给VM(来宾KVM)的设备的中断处理的工作原理,但是没有任何线索?
假设我有一个通过VFIO直接分配给Guest VM的设备(设备直通),并且该设备有硬件中断吗?
接下来发生什么?
小智 7
主机内核接收来自设备的中断,并将其路由到由vfio总线驱动程序,vfio-pci或vfio-platform注册的中断处理程序。该中断处理程序仅将中断中继到用户(QEMU)通过ioctl配置的eventfd。使用KVM时,用户可以将来自vfio的中断信号eventfd直接连接到KVM中的注入irqfd的中断。这样可以避免将中断反弹到QEMU用户空间以注入到来宾中,尽管如果KVM irqfd支持不可用,则可以选择该路径。
对于级别触发的中断,我们还必须屏蔽主机中的中断中断,以防止在来宾服务中断时设备继续中断主机。因此,我们在发信号通知eventfd之前屏蔽了该中断,并使用了稍微不同的KVM irqfd(称为重采样irqfd),该寄存器注册了第二对eventfd-irqfd对,用于发信号通知从KVM到vfio的取消屏蔽。
各种硬件技术对此进行了增强,以提高效率。在某些情况下,Intel APICv允许将中断直接注入来宾而无需vmexit。这完全在KVM中处理。当正确的vCPU在接收硬件中断的处理器上运行时,英特尔发布的中断将允许中断完全绕过主机。ARM IRQ转发使来宾可以管理中断的取消屏蔽,从而避免重新采样irqfd开销。