通过 VFIO 对分配的设备进行中断处理
Interrupt handling for assigned Device through VFIO
我试图了解中断处理如何通过 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 对,用于向 vfio 发出取消屏蔽信号。
各种硬件技术对此进行了增强以提高效率。在某些情况下,英特尔 APICv 允许在没有 vmexit 的情况下将中断直接注入客户机。这完全在 KVM 中处理。当正确的 vCPU 在接收硬件中断的处理器上 运行 时,Intel Posted Interrupts 将允许中断完全绕过主机。 ARM IRQ 转发允许客户机管理中断的取消屏蔽,避免重采样 irqfd 开销。
我试图了解中断处理如何通过 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 对,用于向 vfio 发出取消屏蔽信号。
各种硬件技术对此进行了增强以提高效率。在某些情况下,英特尔 APICv 允许在没有 vmexit 的情况下将中断直接注入客户机。这完全在 KVM 中处理。当正确的 vCPU 在接收硬件中断的处理器上 运行 时,Intel Posted Interrupts 将允许中断完全绕过主机。 ARM IRQ 转发允许客户机管理中断的取消屏蔽,避免重采样 irqfd 开销。