Arm 通过VFIO对指定设备进行中断处理

Arm 通过VFIO对指定设备进行中断处理,arm,linux-device-driver,kvm,interrupt-handling,vfio,Arm,Linux Device Driver,Kvm,Interrupt Handling,Vfio,我试图了解通过VFIO分配给VM(Guest KVM)的设备的中断处理是如何工作的,但没有得到任何关于它是如何发生的线索 比方说,我有一个设备,它通过VFIO直接分配(设备传递)给来宾VM,这个特定设备会出现硬件中断吗 接下来会发生什么?主机内核接收到来自设备的中断,并将其路由到vfio总线驱动程序、vfio pci或vfio平台注册的中断处理程序。该中断处理程序只是将中断中继到用户(QEMU)通过ioctl配置的eventfd。当使用KVM时,用户能够将来自vfio的中断信令eventfd直接

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

比方说,我有一个设备,它通过VFIO直接分配(设备传递)给来宾VM,这个特定设备会出现硬件中断吗


接下来会发生什么?

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

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


各种硬件技术对此进行了增强,以提高效率。Intel APICv允许在某些情况下直接将中断注入来宾,而无需vmexit。这完全在KVM中处理。当接收硬件中断的处理器上运行正确的vCPU时,英特尔发布的中断将允许中断完全绕过主机。ARM IRQ转发允许来宾管理中断的解密,避免重新采样irqfd开销。

谢谢@Alex,它极大地帮助了我:)只要从源代码的角度跟进问题,我就可以看到vfio平台的“eventfd_信号(IRQ_ctx->trigger,1);”将向KVM来宾发送中断信号,但我无法找到QEMU源事件FD调用中的何处,并通过IOCTL进行配置?此外,当涉及KVM时,我也没有意识到QEMU能够将中断信号eventfd从VFIO直接连接到KVM中的中断注入irqfd。在Eric的v12分支中,eventfd连接是在平台中进行的。c:VFIO\u set\u trigger\u irqfd()。这使内核模块能够在intp->中断事件通知程序中通知eventfd设置。irqfd是通过同一文件中的vfio_start_irqfd_injection()设置的。EventFD是内核向文件描述符发送信号的机制,通常用于用户空间信号。IRQFD是一种机制,用户空间通过文件描述符向内核发送信号,以便将中断注入VM。如果我们对两者使用相同的文件描述符,我们就可以透明地将vfio连接到kvm。