When __iommu_map() fails (as expected for MMIO in iommufd modes), the
test proceeds to call __iommu_unmap() for cleanup.

The behavior of unmapping a non-existent range differs between iommufd
native and compat modes:
- Native iommufd returns -ENOENT (failure).
- Compat iommufd returns 0 (success), mimicking legacy VFIO behavior.

The previous code asserted that __iommu_unmap() always fails, which
caused test failures in compat mode. Fix this by checking the return
value based on the iommufd mode.

Signed-off-by: Yi Lai <[email protected]>
---
 .../testing/selftests/vfio/vfio_dma_mapping_mmio_test.c  | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/vfio/vfio_dma_mapping_mmio_test.c 
b/tools/testing/selftests/vfio/vfio_dma_mapping_mmio_test.c
index 4f7ecdca0215..e6a2b2ff91f0 100644
--- a/tools/testing/selftests/vfio/vfio_dma_mapping_mmio_test.c
+++ b/tools/testing/selftests/vfio/vfio_dma_mapping_mmio_test.c
@@ -101,7 +101,14 @@ static void do_mmio_map_test(struct iommu *iommu,
                iommu_unmap(iommu, &region);
        } else {
                VFIO_ASSERT_NE(__iommu_map(iommu, &region), 0);
-               VFIO_ASSERT_NE(__iommu_unmap(iommu, &region, NULL), 0);
+               /*
+                * Native IOMMUFD returns -ENOENT and Compat IOMMUFD returns 0
+                * for unmapping a non-existent range.
+                */
+               if (!strcmp(iommu->mode->name, MODE_IOMMUFD))
+                       VFIO_ASSERT_NE(__iommu_unmap(iommu, &region, NULL), 0);
+               else
+                       VFIO_ASSERT_EQ(__iommu_unmap(iommu, &region, NULL), 0);
        }
 }
 
-- 
2.43.0


Reply via email to