2015-04-05 102 views
2

我想了解如何中断处理通过VFIO分配给VM(客户KVM)的设备工作,但没有得到任何线索它如何发生?通过VFIO中断处理分配的设备

比方说,我有一个设备通过VFIO直接分配给设备(设备传递)给Guest虚拟机,并且出现了该设备的硬件中断?

接下来会发生什么?

回答

3

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

对于电平触发中断,我们还必须屏蔽主机中的中断中断,以防止设备在中断由guest虚拟机提供服务时继续中断主机。因此,我们在发信号通知eventfd之前屏蔽中断,并使用一个稍微不同的KVM irqfd,称为重采样irqfd,它注册了第二个eventfd-irqfd对,用于将从KVM发出的unmask信号发送给vfio。

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

+0

谢谢@Alex,它帮了我很大的力量:) – 2015-04-20 04:55:58

+0

从源代码的角度来看,我可以看到,对于vfio-platform \t“eventfd_signal(irq_ctx-> trigger,1);”会发出中断信号给KVM guest,但我找不到在QEMU源eventfd调用通过IOCTL的调用和配置?当涉及KVM时,我也没有明白这一点QEMU能够将VFIO的中断信令eventfd直接连接到KVM中的中断注入irqfd。 – 2015-04-20 12:27:53

+0

在Eric的v12分支中,eventfd连接在platform.c中进行:vfio_set_trigger_irqfd()。这使内核模块能够通知intp-> interrupt事件通知器中的eventfd设置。 irqfd通过vfio_start_irqfd_injection()在同一个文件中设置。 Eventfds是内核向文件描述符发送信号的机制,通常用于用户空间信令。 IRQfds是用户空间通过文件描述符向内核发送信号的机制,用于向VM中注入中断。如果我们对两者使用相同的文件描述符,我们可以透明地将vfio连接到kvm。 – 2015-04-21 14:54:27

相关问题