[PATCH i-g-t 2/2] tests/intel/xe_vm: Unify bind-flag-invalid and bind-array-flag-invalid test functions

Christoph Manszewski christoph.manszewski at intel.com
Tue Aug 12 13:01:42 UTC 2025


Unify the single bind and array bind invalid flag subtests by using a
common test function which parametrizes the number of bind operations to
perform.

Cc: Matthew Brost <matthew.brost at intel.com>
Cc: Francois Dugast <francois.dugast at intel.com>
Signed-off-by: Christoph Manszewski <christoph.manszewski at intel.com>
---
 tests/intel/xe_vm.c | 98 +++++++--------------------------------------
 1 file changed, 15 insertions(+), 83 deletions(-)

diff --git a/tests/intel/xe_vm.c b/tests/intel/xe_vm.c
index 236494407..7a37bfe05 100644
--- a/tests/intel/xe_vm.c
+++ b/tests/intel/xe_vm.c
@@ -2191,86 +2191,6 @@ static bool pxp_interface_supported(int fd)
 	return ret != -EINVAL;
 }
 
-/**
- * SUBTEST: bind-flag-invalid
- * Functionality: bind
- * Description: Ensure invalid bind flags are rejected.
- * Test category: negative test
- */
-static void bind_flag_invalid(int fd)
-{
-	uint32_t bo, bo_size = xe_get_default_alignment(fd);
-	uint64_t addr = 0x1a0000;
-	uint32_t vm;
-	struct drm_xe_vm_bind bind;
-	struct drm_xe_sync sync[1] = {
-		{ .type = DRM_XE_SYNC_TYPE_SYNCOBJ, .flags = DRM_XE_SYNC_FLAG_SIGNAL, },
-	};
-
-	vm = xe_vm_create(fd, 0, 0);
-	bo = xe_bo_create(fd, vm, bo_size, vram_if_possible(fd, 0), 0);
-	sync[0].handle = syncobj_create(fd, 0);
-
-	memset(&bind, 0, sizeof(bind));
-	bind.vm_id = vm;
-	bind.num_binds = 1;
-	bind.bind.obj = bo;
-	bind.bind.range = bo_size;
-	bind.bind.addr = addr;
-	bind.bind.op = DRM_XE_VM_BIND_OP_MAP;
-	bind.bind.pat_index = intel_get_pat_idx_wb(fd);
-	bind.num_syncs = 1;
-	bind.syncs = (uintptr_t)sync;
-
-	/* Using valid flags should work */
-	bind.bind.flags = 0;
-	igt_ioctl(fd, DRM_IOCTL_XE_VM_BIND, &bind);
-	igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL));
-	syncobj_reset(fd, &sync[0].handle, 1);
-
-	bind.bind.flags = DRM_XE_VM_BIND_FLAG_READONLY;
-	igt_ioctl(fd, DRM_IOCTL_XE_VM_BIND, &bind);
-	igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL));
-	syncobj_reset(fd, &sync[0].handle, 1);
-
-	bind.bind.flags = DRM_XE_VM_BIND_FLAG_IMMEDIATE;
-	igt_ioctl(fd, DRM_IOCTL_XE_VM_BIND, &bind);
-	igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL));
-	syncobj_reset(fd, &sync[0].handle, 1);
-
-	if (pxp_interface_supported(fd)) {
-		bind.bind.flags = DRM_XE_VM_BIND_FLAG_CHECK_PXP;
-		igt_ioctl(fd, DRM_IOCTL_XE_VM_BIND, &bind);
-		igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL));
-		syncobj_reset(fd, &sync[0].handle, 1);
-	}
-
-	bind.bind.flags = DRM_XE_VM_BIND_FLAG_NULL;
-	bind.bind.obj = 0;
-	igt_ioctl(fd, DRM_IOCTL_XE_VM_BIND, &bind);
-	igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL));
-	syncobj_reset(fd, &sync[0].handle, 1);
-	bind.bind.obj = bo;
-
-	bind.bind.flags = DRM_XE_VM_BIND_FLAG_DUMPABLE;
-	igt_ioctl(fd, DRM_IOCTL_XE_VM_BIND, &bind);
-	igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL));
-	syncobj_reset(fd, &sync[0].handle, 1);
-
-	/* Using invalid flags should not work */
-	bind.bind.flags = 1 << 5;
-	igt_ioctl(fd, DRM_IOCTL_XE_VM_BIND, &bind);
-	do_ioctl_err(fd, DRM_IOCTL_XE_VM_BIND, &bind, EINVAL);
-
-	/* Using valid flags should still work */
-	bind.bind.flags = 0;
-	igt_ioctl(fd, DRM_IOCTL_XE_VM_BIND, &bind);
-	igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL));
-
-	syncobj_destroy(fd, sync[0].handle);
-	xe_vm_destroy(fd, vm);
-}
-
 static void __bind_flag_valid(int fd, uint32_t bo, struct drm_xe_vm_bind bind,
 			      struct drm_xe_vm_bind_op *bind_ops, int num_binds)
 {
@@ -2293,6 +2213,9 @@ static void __bind_flag_valid(int fd, uint32_t bo, struct drm_xe_vm_bind bind,
 			bind_ops[j].obj = valid_flags[i] == DRM_XE_VM_BIND_FLAG_NULL ? 0 : bo;
 		}
 
+		if (num_binds == 1)
+			bind.bind = bind_ops[0];
+
 		igt_ioctl(fd, DRM_IOCTL_XE_VM_BIND, &bind);
 		igt_assert(syncobj_wait(fd, &sync[0].handle, 1, INT64_MAX, 0, NULL));
 		syncobj_reset(fd, &sync[0].handle, 1);
@@ -2300,6 +2223,11 @@ static void __bind_flag_valid(int fd, uint32_t bo, struct drm_xe_vm_bind bind,
 }
 
 /**
+ * SUBTEST: bind-flag-invalid
+ * Functionality: bind
+ * Description: Ensure invalid bind flags are rejected.
+ * Test category: negative test
+ *
  * SUBTEST: bind-array-flag-invalid
  * Functionality: bind
  * Description: Ensure invalid bind flags are rejected when submitting an array of binds.
@@ -2317,7 +2245,7 @@ static void test_bind_flag_invalid(int fd, int num_binds)
 		{ .type = DRM_XE_SYNC_TYPE_SYNCOBJ, .flags = DRM_XE_SYNC_FLAG_SIGNAL, },
 	};
 
-	igt_assert(num_binds > 1);
+	igt_assert(num_binds > 0);
 
 	vm = xe_vm_create(fd, 0, 0);
 	bo = xe_bo_create(fd, vm, bo_size, vram_if_possible(fd, 0), 0);
@@ -2333,7 +2261,8 @@ static void test_bind_flag_invalid(int fd, int num_binds)
 	}
 
 	memset(&bind, 0, sizeof(bind));
-	bind.vector_of_binds = to_user_pointer(bind_ops);
+	if (num_binds > 1)
+		bind.vector_of_binds = to_user_pointer(bind_ops);
 	bind.num_binds = num_binds;
 	bind.syncs = to_user_pointer(sync);
 	bind.num_syncs = 1;
@@ -2348,6 +2277,9 @@ static void test_bind_flag_invalid(int fd, int num_binds)
 		bind_ops[i].obj = bo;
 	}
 
+	if (num_binds == 1)
+		bind.bind = bind_ops[0];
+
 	do_ioctl_err(fd, DRM_IOCTL_XE_VM_BIND, &bind, EINVAL);
 
 	/* Using valid flags should still work */
@@ -2676,7 +2608,7 @@ igt_main
 		userptr_invalid(fd);
 
 	igt_subtest("bind-flag-invalid")
-		bind_flag_invalid(fd);
+		test_bind_flag_invalid(fd, 1);
 
 	igt_subtest("compact-64k-pages")
 		xe_for_each_engine(fd, hwe) {
-- 
2.47.1



More information about the igt-dev mailing list