[PATCH RFC v3 73/88] KVM: selftests: Verify VFIO region info for igb device
From: Ackerley Tng via B4 Relay
Date: Fri Nov 06 2026 - 19:59:12 EST
From: Ackerley Tng <ackerleytng@xxxxxxxxxx>
Add a subtest for VFIO region info queries on the bound device.
Verify that the operational register MMIO space (128 KiB), MSI-X table
and PBA space (16 KiB), and extended PCIe configuration space (4096 bytes)
report their exact sizes and expected access capability flags.
Testing multiple regions establishes baseline checks on the underlying
device descriptor so that when VFIO BARs are later delegated to or wrapped
by guest_memfd, native region querying on the device descriptor is
confirmed to remain unaffected.
---
.../selftests/kvm/x86/guest_memfd_vfio_test.c | 38 ++++++++++++++++++++++
1 file changed, 38 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 669acc6058b5b..c76abe6d45140 100644
--- a/tools/testing/selftests/kvm/x86/guest_memfd_vfio_test.c
+++ b/tools/testing/selftests/kvm/x86/guest_memfd_vfio_test.c
@@ -150,4 +150,42 @@ TEST_F(guest_memfd_vfio, get_device_info)
ASSERT_GT(dev_info.num_irqs, 0);
}
+TEST_F(guest_memfd_vfio, get_region_info)
+{
+ struct vfio_region_info reg_info = {};
+ int ret;
+
+ /* Test BAR0: 128 KiB MMIO register space */
+ reg_info.argsz = sizeof(reg_info);
+ reg_info.index = VFIO_PCI_BAR0_REGION_INDEX;
+ ret = ioctl(self->vfio_fd, VFIO_DEVICE_GET_REGION_INFO, ®_info);
+ ASSERT_EQ(0, ret);
+ ASSERT_EQ(0x20000, reg_info.size);
+ ASSERT_EQ(VFIO_REGION_INFO_FLAG_READ |
+ VFIO_REGION_INFO_FLAG_WRITE |
+ VFIO_REGION_INFO_FLAG_MMAP,
+ reg_info.flags & (VFIO_REGION_INFO_FLAG_READ |
+ VFIO_REGION_INFO_FLAG_WRITE |
+ VFIO_REGION_INFO_FLAG_MMAP));
+
+ /* Test BAR3: 16 KiB MSI-X table and PBA */
+ memset(®_info, 0, sizeof(reg_info));
+ reg_info.argsz = sizeof(reg_info);
+ reg_info.index = VFIO_PCI_BAR3_REGION_INDEX;
+ ret = ioctl(self->vfio_fd, VFIO_DEVICE_GET_REGION_INFO, ®_info);
+ ASSERT_EQ(0, ret);
+ ASSERT_EQ(0x4000, reg_info.size);
+
+ /* Test PCIe Config Space: 4096 bytes extended config */
+ memset(®_info, 0, sizeof(reg_info));
+ reg_info.argsz = sizeof(reg_info);
+ reg_info.index = VFIO_PCI_CONFIG_REGION_INDEX;
+ ret = ioctl(self->vfio_fd, VFIO_DEVICE_GET_REGION_INFO, ®_info);
+ ASSERT_EQ(0, ret);
+ ASSERT_EQ(PCI_CFG_SPACE_EXP_SIZE, reg_info.size);
+ ASSERT_EQ(VFIO_REGION_INFO_FLAG_READ | VFIO_REGION_INFO_FLAG_WRITE,
+ reg_info.flags & (VFIO_REGION_INFO_FLAG_READ |
+ VFIO_REGION_INFO_FLAG_WRITE));
+}
+
TEST_HARNESS_MAIN
--
2.56.0.455.g6c5a503b38-goog