Thread (17 messages) 17 messages, 2 authors, 2026-08-13

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

flat view

From: David Matlack <dmatlack@google.com>
Date: 2026-08-12 22:13:37
Also in: kvm, linux-kselftest, linux-patches, linux-rdma

On Wed, Aug 12, 2026 at 3:11 PM David Matlack [off-list ref] wrote:
quoted hunk ↗ jump to hunk
On 2026-08-12 11:59 AM, Jason Gunthorpe wrote:
quoted
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 <jgg@nvidia.com>
...
quoted
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());
...
quoted
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),
Oops, that should be VFIO_ASSERT_LE().
quoted hunk ↗ jump to hunk
+                      "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());
        }
 }
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help