On 2026-05-15 02:30 PM, Jason Gunthorpe wrote: > 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 <[email protected]> > --- > 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/vfio_pci_driver_test.c | 7 ++++++- > 4 files changed, 14 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/vfio_pci_driver_test.c > b/tools/testing/selftests/vfio/vfio_pci_driver_test.c > index afa0480ddd9b2a..5a46800cde4c8d 100644 > --- a/tools/testing/selftests/vfio/vfio_pci_driver_test.c > +++ b/tools/testing/selftests/vfio/vfio_pci_driver_test.c > @@ -2,6 +2,7 @@ > #include <sys/ioctl.h> > #include <sys/mman.h> > > +#include <linux/log2.h> > #include <linux/sizes.h> > #include <linux/vfio.h> > > @@ -80,7 +81,11 @@ 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); > + > + VFIO_ASSERT_NE(driver->ops->region_size, 0); > + region_setup(self->iommu, self->iova_allocator, &driver->region, > + max_t(u64, roundup_pow_of_two(driver->ops->region_size), > + SZ_2M));
We have some other upcoming tests that want to set up the driver region, so it would be nice to move this into the library. * https://lore.kernel.org/kvm/[email protected]/ * https://lore.kernel.org/kvm/[email protected]/ What about something like this? diff --git a/tools/testing/selftests/vfio/lib/drivers/dsa/dsa.c b/tools/testing/selftests/vfio/lib/drivers/dsa/dsa.c index 19d9630b24c2..40b8541b588e 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 a871b935542b..c9b28365c5eb 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 e5ada209b1d1..547369c5cff9 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 6827f4a6febe..c70c22b1a86c 100644 --- a/tools/testing/selftests/vfio/lib/vfio_pci_driver.c +++ b/tools/testing/selftests/vfio/lib/vfio_pci_driver.c @@ -28,6 +28,9 @@ 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 = roundup(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 afa0480ddd9b..36d977542274 100644 --- a/tools/testing/selftests/vfio/vfio_pci_driver_test.c +++ b/tools/testing/selftests/vfio/vfio_pci_driver_test.c @@ -80,7 +80,7 @@ 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); > > /* 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 >
