Commit b8e96c88 authored by David Matlack's avatar David Matlack Committed by Alex Williamson
Browse files

vfio: selftests: Eliminate INVALID_IOVA



Eliminate INVALID_IOVA as there are platforms where UINT64_MAX is a
valid iova.

Reviewed-by: default avatarAlex Mastro <amastro@fb.com>
Tested-by: default avatarAlex Mastro <amastro@fb.com>
Reviewed-by: default avatarRaghavendra Rao Ananta <rananta@google.com>
Signed-off-by: default avatarDavid Matlack <dmatlack@google.com>
Link: https://lore.kernel.org/r/20251126231733.3302983-18-dmatlack@google.com


Signed-off-by: default avatarAlex Williamson <alex@shazbot.org>
parent 5fabc49a
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -8,7 +8,6 @@
#include <libvfio/assert.h>

typedef u64 iova_t;
#define INVALID_IOVA UINT64_MAX

struct iommu_mode {
	const char *name;
@@ -57,7 +56,7 @@ static inline void iommu_unmap_all(struct iommu *iommu)
	VFIO_ASSERT_EQ(__iommu_unmap_all(iommu, NULL), 0);
}

iova_t __iommu_hva2iova(struct iommu *iommu, void *vaddr);
int __iommu_hva2iova(struct iommu *iommu, void *vaddr, iova_t *iova);
iova_t iommu_hva2iova(struct iommu *iommu, void *vaddr);

struct iommu_iova_range *iommu_iova_ranges(struct iommu *iommu, u32 *nranges);
+2 −2
Original line number Diff line number Diff line
@@ -103,9 +103,9 @@ static inline void vfio_pci_msix_disable(struct vfio_pci_device *device)
	vfio_pci_irq_disable(device, VFIO_PCI_MSIX_IRQ_INDEX);
}

static inline iova_t __to_iova(struct vfio_pci_device *device, void *vaddr)
static inline int __to_iova(struct vfio_pci_device *device, void *vaddr, iova_t *iova)
{
	return __iommu_hva2iova(device->iommu, vaddr);
	return __iommu_hva2iova(device->iommu, vaddr, iova);
}

static inline iova_t to_iova(struct vfio_pci_device *device, void *vaddr)
+9 −5
Original line number Diff line number Diff line
@@ -67,7 +67,7 @@ static const struct iommu_mode *lookup_iommu_mode(const char *iommu_mode)
	VFIO_FAIL("Unrecognized IOMMU mode: %s\n", iommu_mode);
}

iova_t __iommu_hva2iova(struct iommu *iommu, void *vaddr)
int __iommu_hva2iova(struct iommu *iommu, void *vaddr, iova_t *iova)
{
	struct dma_region *region;

@@ -78,18 +78,22 @@ iova_t __iommu_hva2iova(struct iommu *iommu, void *vaddr)
		if (vaddr >= region->vaddr + region->size)
			continue;

		return region->iova + (vaddr - region->vaddr);
		if (iova)
			*iova = region->iova + (vaddr - region->vaddr);

		return 0;
	}

	return INVALID_IOVA;
	return -ENOENT;
}

iova_t iommu_hva2iova(struct iommu *iommu, void *vaddr)
{
	iova_t iova;
	int ret;

	iova = __iommu_hva2iova(iommu, vaddr);
	VFIO_ASSERT_NE(iova, INVALID_IOVA, "%p is not mapped into IOMMU\n", vaddr);
	ret = __iommu_hva2iova(iommu, vaddr, &iova);
	VFIO_ASSERT_EQ(ret, 0, "%p is not mapped into the iommu\n", vaddr);

	return iova;
}
+1 −1
Original line number Diff line number Diff line
@@ -199,7 +199,7 @@ TEST_F(vfio_dma_mapping_test, dma_map_unmap)
	ASSERT_EQ(rc, 0);
	ASSERT_EQ(unmapped, region.size);
	printf("Unmapped IOVA 0x%lx\n", region.iova);
	ASSERT_EQ(INVALID_IOVA, __to_iova(self->device, region.vaddr));
	ASSERT_NE(0, __to_iova(self->device, region.vaddr, NULL));
	ASSERT_NE(0, iommu_mapping_get(device_bdf, region.iova, &mapping));

	ASSERT_TRUE(!munmap(region.vaddr, size));