[PATCH v3 07/11] vfio: selftests: Allow drivers to specify required region size
From: Jason Gunthorpe <jgg@nvidia.com>
Date: 2026-07-16 17:03:39
Also in:
kvm, linux-kselftest, linux-patches, linux-rdma, llvm
Subsystem:
kernel selftest framework, the rest, vfio driver, vfio selftests · Maintainers:
Shuah Khan, Linus Torvalds, Alex Williamson, David Matlack
Add a region_size field to struct vfio_pci_driver_ops so drivers can declare how much DMA-mapped region they need. The mlx5 driver will need ~18MB for firmware pages. Existing drivers pass in the sizeof their state struct. The core code will round up and minimize it to SZ_2M so as not to change any test behavior. Assisted-by: Claude:claude-opus-4.6 Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> --- tools/testing/selftests/vfio/lib/drivers/dsa/dsa.c | 1 + tools/testing/selftests/vfio/lib/drivers/ioat/ioat.c | 1 + .../selftests/vfio/lib/include/libvfio/vfio_pci_driver.h | 6 ++++++ tools/testing/selftests/vfio/lib/vfio_pci_driver.c | 7 +++++++ tools/testing/selftests/vfio/vfio_pci_driver_test.c | 3 ++- 5 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/vfio/lib/drivers/dsa/dsa.c b/tools/testing/selftests/vfio/lib/drivers/dsa/dsa.c
index 19d9630b24c23f..40b8541b588eee 100644
--- a/tools/testing/selftests/vfio/lib/drivers/dsa/dsa.c
+++ b/tools/testing/selftests/vfio/lib/drivers/dsa/dsa.c@@ -418,6 +418,7 @@ static void dsa_send_msi(struct vfio_pci_device *device) const struct vfio_pci_driver_ops dsa_ops = { .name = "dsa", + .region_size = sizeof(struct dsa_state), .probe = dsa_probe, .init = dsa_init, .remove = dsa_remove,
diff --git a/tools/testing/selftests/vfio/lib/drivers/ioat/ioat.c b/tools/testing/selftests/vfio/lib/drivers/ioat/ioat.c
index a871b935542bad..c9b28365c5eb6b 100644
--- a/tools/testing/selftests/vfio/lib/drivers/ioat/ioat.c
+++ b/tools/testing/selftests/vfio/lib/drivers/ioat/ioat.c@@ -226,6 +226,7 @@ static void ioat_send_msi(struct vfio_pci_device *device) const struct vfio_pci_driver_ops ioat_ops = { .name = "ioat", + .region_size = sizeof(struct ioat_state), .probe = ioat_probe, .init = ioat_init, .remove = ioat_remove,
diff --git a/tools/testing/selftests/vfio/lib/include/libvfio/vfio_pci_driver.h b/tools/testing/selftests/vfio/lib/include/libvfio/vfio_pci_driver.h
index e5ada209b1d102..547369c5cff95a 100644
--- a/tools/testing/selftests/vfio/lib/include/libvfio/vfio_pci_driver.h
+++ b/tools/testing/selftests/vfio/lib/include/libvfio/vfio_pci_driver.h@@ -9,6 +9,12 @@ struct vfio_pci_device; struct vfio_pci_driver_ops { const char *name; + /* + * Size of the driver's state structure overlaid on + * device->driver.region.vaddr + */ + u64 region_size; + /** * @probe() - Check if the driver supports the given device. *
diff --git a/tools/testing/selftests/vfio/lib/vfio_pci_driver.c b/tools/testing/selftests/vfio/lib/vfio_pci_driver.c
index 6827f4a6febe99..e13bbb7ee423dc 100644
--- a/tools/testing/selftests/vfio/lib/vfio_pci_driver.c
+++ b/tools/testing/selftests/vfio/lib/vfio_pci_driver.c@@ -1,5 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only #include "kselftest.h" +#include <linux/sizes.h> +#include <linux/log2.h> #include <libvfio.h> #ifdef __x86_64__
@@ -28,6 +30,11 @@ void vfio_pci_driver_probe(struct vfio_pci_device *device) continue; device->driver.ops = ops; + + VFIO_ASSERT_NE(ops->region_size, 0); + device->driver.region.size = + max_t(u64, roundup_pow_of_two(ops->region_size), + getpagesize()); } }
diff --git a/tools/testing/selftests/vfio/vfio_pci_driver_test.c b/tools/testing/selftests/vfio/vfio_pci_driver_test.c
index afa0480ddd9b2a..f68239da574f5a 100644
--- a/tools/testing/selftests/vfio/vfio_pci_driver_test.c
+++ b/tools/testing/selftests/vfio/vfio_pci_driver_test.c@@ -80,7 +80,8 @@ FIXTURE_SETUP(vfio_pci_driver_test) driver = &self->device->driver; region_setup(self->iommu, self->iova_allocator, &self->memcpy_region, SZ_1G); - region_setup(self->iommu, self->iova_allocator, &driver->region, SZ_2M); + region_setup(self->iommu, self->iova_allocator, &driver->region, + driver->region.size); /* Any IOVA that doesn't overlap memcpy_region and driver->region. */ self->unmapped_iova = iova_allocator_alloc(self->iova_allocator, SZ_1G);
--
2.43.0