[PATCH RFC v3 74/88] KVM: selftests: Verify VFIO IRQ info for igb device

From: Ackerley Tng via B4 Relay

Date: Fri Nov 06 2026 - 19:52:34 EST


From: Ackerley Tng <ackerleytng@xxxxxxxxxx>

Add a subtest to verify interrupt capability queries on the bound
Intel 82576 device.

Check that MSI-X reports a positive vector count with eventfd signaling
support, that MSI reports eventfd capability, and that INTx reports
eventfd support along with maskable and auto-masked flags when present.

Testing multiple interrupt types establishes baseline checks on the
underlying device descriptor so that when VFIO resources are later
delegated to or wrapped by guest_memfd, native capability querying on
the device descriptor remains unaffected.
---
.../selftests/kvm/x86/guest_memfd_vfio_test.c | 48 ++++++++++++++++++++++
1 file changed, 48 insertions(+)

diff --git a/tools/testing/selftests/kvm/x86/guest_memfd_vfio_test.c b/tools/testing/selftests/kvm/x86/guest_memfd_vfio_test.c
index c76abe6d45140..6525f392b3930 100644
--- a/tools/testing/selftests/kvm/x86/guest_memfd_vfio_test.c
+++ b/tools/testing/selftests/kvm/x86/guest_memfd_vfio_test.c
@@ -188,4 +188,52 @@ TEST_F(guest_memfd_vfio, get_region_info)
VFIO_REGION_INFO_FLAG_WRITE));
}

+TEST_F(guest_memfd_vfio, get_irq_info)
+{
+ struct vfio_irq_info irq_info = {};
+ int ret;
+
+ /*
+ * Test MSI-X interrupts (VFIO_PCI_MSIX_IRQ_INDEX):
+ * Intel 82576 supports up to 10 MSI-X vectors.
+ */
+ irq_info.argsz = sizeof(irq_info);
+ irq_info.index = VFIO_PCI_MSIX_IRQ_INDEX;
+ ret = ioctl(self->vfio_fd, VFIO_DEVICE_GET_IRQ_INFO, &irq_info);
+ ASSERT_EQ(0, ret);
+ ASSERT_GT(irq_info.count, 0);
+ ASSERT_TRUE(irq_info.flags & VFIO_IRQ_INFO_EVENTFD);
+
+ /*
+ * Test MSI interrupts (VFIO_PCI_MSI_IRQ_INDEX):
+ * Should report eventfd capability.
+ */
+ memset(&irq_info, 0, sizeof(irq_info));
+ irq_info.argsz = sizeof(irq_info);
+ irq_info.index = VFIO_PCI_MSI_IRQ_INDEX;
+ ret = ioctl(self->vfio_fd, VFIO_DEVICE_GET_IRQ_INFO, &irq_info);
+ ASSERT_EQ(0, ret);
+ ASSERT_GT(irq_info.count, 0);
+ ASSERT_TRUE(irq_info.flags & VFIO_IRQ_INFO_EVENTFD);
+
+ /*
+ * Test legacy INTx interrupts (VFIO_PCI_INTX_IRQ_INDEX):
+ * Must support eventfd and masking when present.
+ */
+ memset(&irq_info, 0, sizeof(irq_info));
+ irq_info.argsz = sizeof(irq_info);
+ irq_info.index = VFIO_PCI_INTX_IRQ_INDEX;
+ ret = ioctl(self->vfio_fd, VFIO_DEVICE_GET_IRQ_INFO, &irq_info);
+ ASSERT_EQ(0, ret);
+ ASSERT_LE(irq_info.count, 1);
+ if (irq_info.count == 1) {
+ ASSERT_EQ(VFIO_IRQ_INFO_EVENTFD |
+ VFIO_IRQ_INFO_MASKABLE |
+ VFIO_IRQ_INFO_AUTOMASKED,
+ irq_info.flags & (VFIO_IRQ_INFO_EVENTFD |
+ VFIO_IRQ_INFO_MASKABLE |
+ VFIO_IRQ_INFO_AUTOMASKED));
+ }
+}
+
TEST_HARNESS_MAIN

--
2.56.0.455.g6c5a503b38-goog