Re: [PATCH v4 06/10] vfio: selftests: Allow drivers to specify required region size

David Matlack <[email protected]>
Newsgroups org.kernel.vger.linux-rdma,dev.linux.lists.patches,org.kernel.vger.kvm,org.kernel.vger.linux-kselftest,org.kernel.vger.netdev
Message-ID <[email protected]>
On 2026-08-12 11:59 AM, 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. Since drivers all use only their declared state we can use the
> value directly and remove the SZ_2M hard coding.
> 
> Assisted-by: Claude:claude-opus-4.6
> Signed-off-by: Jason Gunthorpe <[email protected]>

...

> diff --git a/tools/testing/selftests/vfio/lib/iova_allocator.c b/tools/testing/selftests/vfio/lib/iova_allocator.c
> index 4a660f636f4972..c8075575e9131d 100644
> --- a/tools/testing/selftests/vfio/lib/iova_allocator.c
> +++ b/tools/testing/selftests/vfio/lib/iova_allocator.c
> @@ -13,8 +13,10 @@
>  
>  #include <linux/iommufd.h>
>  #include <linux/limits.h>
> +#include <linux/log2.h>
>  #include <linux/mman.h>
>  #include <linux/overflow.h>
> +#include <linux/sizes.h>
>  #include <linux/types.h>
>  #include <linux/vfio.h>
>  
> @@ -50,7 +52,8 @@ void iova_allocator_cleanup(struct iova_allocator *allocator)
>  iova_t iova_allocator_alloc(struct iova_allocator *allocator, size_t size)
>  {
>  	VFIO_ASSERT_GT(size, 0, "Invalid size arg, zero\n");
> -	VFIO_ASSERT_EQ(size & (size - 1), 0, "Invalid size arg, non-power-of-2\n");
> +	/* Adjust the size to the allocator requirements */
> +	size = max_t(u64, roundup_pow_of_two(size), getpagesize());

...

> diff --git a/tools/testing/selftests/vfio/lib/vfio_pci_driver.c b/tools/testing/selftests/vfio/lib/vfio_pci_driver.c
> index 5e65434d2318b2..52b9c2a2bbb9b6 100644
> --- a/tools/testing/selftests/vfio/lib/vfio_pci_driver.c
> +++ b/tools/testing/selftests/vfio/lib/vfio_pci_driver.c
> @@ -32,6 +32,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 = ops->region_size;

I'm seeing failures with the IGB driver with this series. I think it's
coming from here. The region size needs to be page-aligned so that the
IOMMU map/unmap calls can work?

The size of struct igb is 0x20080 bytes which is not page-aligned. The
size of struct mlx5st_device is 0x200D000, which is page-aligned, so
that's probably why your Claude did not notice.

# #  RUN           vfio_pci_driver_test.iommufd.send_msi ...
# /usr/local/google/home/dmatlack/kernel/trees/review/tools/testing/selftests/vfio/lib/include/libvfio/iommu.h:42:
# Assertion Failure
#
#   Expression: __iommu_map(iommu, region) == 0
#   Observed: 0xffffffffffffffea == 0
#   [errno: 22 - Invalid argument]
#
# # send_msi: Test failed
# #          FAIL  vfio_pci_driver_test.iommufd.send_msi
# not ok 33 vfio_pci_driver_test.iommufd.send_msi

Applying this on top fixes things and also avoids a potential overflow
when doing the roundup_pow_of_two() in the allocator.

diff --git a/tools/testing/selftests/vfio/lib/iova_allocator.c b/tools/testing/selftests/vfio/lib/iova_allocator.c
index c8075575e913..66a160d4ff9d 100644
--- a/tools/testing/selftests/vfio/lib/iova_allocator.c
+++ b/tools/testing/selftests/vfio/lib/iova_allocator.c
@@ -52,8 +52,11 @@ void iova_allocator_cleanup(struct iova_allocator *allocator)
 iova_t iova_allocator_alloc(struct iova_allocator *allocator, size_t size)
 {
 	VFIO_ASSERT_GT(size, 0, "Invalid size arg, zero\n");
-	/* Adjust the size to the allocator requirements */
-	size = max_t(u64, roundup_pow_of_two(size), getpagesize());
+	VFIO_ASSERT_LT(size, rounddown_pow_of_two(SIZE_MAX),
+		       "Invalid size arg, too large (%lu)\n", size);
+
+	size = roundup_pow_of_two(size);

 	for (;;) {
 		struct iommu_iova_range *range;
diff --git a/tools/testing/selftests/vfio/lib/vfio_pci_driver.c b/tools/testing/selftests/vfio/lib/vfio_pci_driver.c
index 96a940ea59b5..b31abfe2c7ff 100644
--- a/tools/testing/selftests/vfio/lib/vfio_pci_driver.c
+++ b/tools/testing/selftests/vfio/lib/vfio_pci_driver.c
@@ -36,7 +36,8 @@ void vfio_pci_driver_probe(struct vfio_pci_device *device)
 		device->driver.ops = ops;

 		VFIO_ASSERT_NE(ops->region_size, 0);
-		device->driver.region.size = ops->region_size;
+		device->driver.region.size =
+			round_up(ops->region_size, getpagesize());
 	}
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.