Skip to content

Commit d323ad7

Browse files
Alex Mastroawilliam
authored andcommitted
vfio: selftests: replace iova=vaddr with allocated iovas
vfio_dma_mapping_test and vfio_pci_driver_test currently use iova=vaddr as part of DMA mapping operations. However, not all IOMMUs support the same virtual address width as the processor. For instance, older Intel consumer platforms only support 39-bits of IOMMU address space. On such platforms, using the virtual address as the IOVA fails. Make the tests more robust by using iova_allocator to vend IOVAs, which queries legally accessible IOVAs from the underlying IOMMUFD or VFIO container. Reviewed-by: David Matlack <[email protected]> Tested-by: David Matlack <[email protected]> Signed-off-by: Alex Mastro <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alex Williamson <[email protected]>
1 parent ce0e3c4 commit d323ad7

2 files changed

Lines changed: 12 additions & 5 deletions

File tree

tools/testing/selftests/vfio/vfio_dma_mapping_test.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ static int iommu_mapping_get(const char *bdf, u64 iova,
9595

9696
FIXTURE(vfio_dma_mapping_test) {
9797
struct vfio_pci_device *device;
98+
struct iova_allocator *iova_allocator;
9899
};
99100

100101
FIXTURE_VARIANT(vfio_dma_mapping_test) {
@@ -119,10 +120,12 @@ FIXTURE_VARIANT_ADD_ALL_IOMMU_MODES(anonymous_hugetlb_1gb, SZ_1G, MAP_HUGETLB |
119120
FIXTURE_SETUP(vfio_dma_mapping_test)
120121
{
121122
self->device = vfio_pci_device_init(device_bdf, variant->iommu_mode);
123+
self->iova_allocator = iova_allocator_init(self->device);
122124
}
123125

124126
FIXTURE_TEARDOWN(vfio_dma_mapping_test)
125127
{
128+
iova_allocator_cleanup(self->iova_allocator);
126129
vfio_pci_device_cleanup(self->device);
127130
}
128131

@@ -144,7 +147,7 @@ TEST_F(vfio_dma_mapping_test, dma_map_unmap)
144147
else
145148
ASSERT_NE(region.vaddr, MAP_FAILED);
146149

147-
region.iova = (u64)region.vaddr;
150+
region.iova = iova_allocator_alloc(self->iova_allocator, size);
148151
region.size = size;
149152

150153
vfio_pci_dma_map(self->device, &region);

tools/testing/selftests/vfio/vfio_pci_driver_test.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ static const char *device_bdf;
1919
} while (0)
2020

2121
static void region_setup(struct vfio_pci_device *device,
22+
struct iova_allocator *iova_allocator,
2223
struct vfio_dma_region *region, u64 size)
2324
{
2425
const int flags = MAP_SHARED | MAP_ANONYMOUS;
@@ -29,7 +30,7 @@ static void region_setup(struct vfio_pci_device *device,
2930
VFIO_ASSERT_NE(vaddr, MAP_FAILED);
3031

3132
region->vaddr = vaddr;
32-
region->iova = (u64)vaddr;
33+
region->iova = iova_allocator_alloc(iova_allocator, size);
3334
region->size = size;
3435

3536
vfio_pci_dma_map(device, region);
@@ -44,6 +45,7 @@ static void region_teardown(struct vfio_pci_device *device,
4445

4546
FIXTURE(vfio_pci_driver_test) {
4647
struct vfio_pci_device *device;
48+
struct iova_allocator *iova_allocator;
4749
struct vfio_dma_region memcpy_region;
4850
void *vaddr;
4951
int msi_fd;
@@ -72,14 +74,15 @@ FIXTURE_SETUP(vfio_pci_driver_test)
7274
struct vfio_pci_driver *driver;
7375

7476
self->device = vfio_pci_device_init(device_bdf, variant->iommu_mode);
77+
self->iova_allocator = iova_allocator_init(self->device);
7578

7679
driver = &self->device->driver;
7780

78-
region_setup(self->device, &self->memcpy_region, SZ_1G);
79-
region_setup(self->device, &driver->region, SZ_2M);
81+
region_setup(self->device, self->iova_allocator, &self->memcpy_region, SZ_1G);
82+
region_setup(self->device, self->iova_allocator, &driver->region, SZ_2M);
8083

8184
/* Any IOVA that doesn't overlap memcpy_region and driver->region. */
82-
self->unmapped_iova = 8UL * SZ_1G;
85+
self->unmapped_iova = iova_allocator_alloc(self->iova_allocator, SZ_1G);
8386

8487
vfio_pci_driver_init(self->device);
8588
self->msi_fd = self->device->msi_eventfds[driver->msi];
@@ -108,6 +111,7 @@ FIXTURE_TEARDOWN(vfio_pci_driver_test)
108111
region_teardown(self->device, &self->memcpy_region);
109112
region_teardown(self->device, &driver->region);
110113

114+
iova_allocator_cleanup(self->iova_allocator);
111115
vfio_pci_device_cleanup(self->device);
112116
}
113117

0 commit comments

Comments
 (0)