[PATCH] xe_exec_compute_mode: Add malloc-ufence test

Matthew Brost matthew.brost at intel.com
Tue Feb 27 02:39:56 UTC 2024


The get user page ufence path is not triggered by the test as ufence
memory is a mapped BO. To trigger this path use a malloc'd address.

Signed-off-by: Matthew Brost <matthew.brost at intel.com>
---
 tests/intel/xe_exec_compute_mode.c | 28 ++++++++++++++++++++--------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/tests/intel/xe_exec_compute_mode.c b/tests/intel/xe_exec_compute_mode.c
index 7dad715093..c0cddbc02b 100644
--- a/tests/intel/xe_exec_compute_mode.c
+++ b/tests/intel/xe_exec_compute_mode.c
@@ -31,6 +31,7 @@
 #define BIND_EXECQUEUE		(0x1 << 4)
 #define VM_FOR_BO			(0x1 << 5)
 #define EXEC_QUEUE_EARLY	(0x1 << 6)
+#define MALLOC_USER_FENCE		(0x1 <<7)
 
 /**
  * SUBTEST: twice-%s
@@ -48,6 +49,7 @@
  * arg[1]:
  *
  * @basic:				basic
+ * @malloc-ufence:			malloc user fence
  * @preempt-fence-early:		preempt fence early
  * @userptr:				userptr
  * @rebind:				rebind
@@ -110,6 +112,7 @@ test_exec(int fd, struct drm_xe_engine_class_instance *eci,
 		uint64_t exec_sync;
 		uint32_t data;
 	} *data;
+	uint64_t *vm_sync;
 	int i, j, b;
 	int map_fd = -1;
 	int64_t fence_timeout;
@@ -149,6 +152,12 @@ test_exec(int fd, struct drm_xe_engine_class_instance *eci,
 	}
 	memset(data, 0, bo_size);
 
+	if (flags & MALLOC_USER_FENCE)
+		vm_sync = malloc(sizeof(*vm_sync));
+	else
+		vm_sync = &data[0].vm_sync;
+	igt_assert(vm_sync);
+
 	for (i = 0; !(flags & EXEC_QUEUE_EARLY) && i < n_exec_queues; i++) {
 		exec_queues[i] = xe_exec_queue_create(fd, vm, eci, 0);
 		if (flags & BIND_EXECQUEUE)
@@ -158,7 +167,7 @@ test_exec(int fd, struct drm_xe_engine_class_instance *eci,
 			bind_exec_queues[i] = 0;
 	};
 
-	sync[0].addr = to_user_pointer(&data[0].vm_sync);
+	sync[0].addr = to_user_pointer(vm_sync);
 	if (bo)
 		xe_vm_bind_async(fd, vm, bind_exec_queues[0], bo, 0, addr,
 				 bo_size, sync, 1);
@@ -171,9 +180,9 @@ test_exec(int fd, struct drm_xe_engine_class_instance *eci,
 
 	fence_timeout = igt_run_in_simulation() ? HUNDRED_SEC : ONE_SEC;
 
-	xe_wait_ufence(fd, &data[0].vm_sync, USER_FENCE_VALUE,
+	xe_wait_ufence(fd, vm_sync, USER_FENCE_VALUE,
 		       bind_exec_queues[0], fence_timeout);
-	data[0].vm_sync = 0;
+	*vm_sync = 0;
 
 	for (i = 0; i < n_execs; i++) {
 		uint64_t batch_offset = (char *)&data[i].batch - (char *)data;
@@ -202,7 +211,7 @@ test_exec(int fd, struct drm_xe_engine_class_instance *eci,
 			xe_vm_unbind_async(fd, vm, bind_exec_queues[e], 0,
 					   addr, bo_size, NULL, 0);
 
-			sync[0].addr = to_user_pointer(&data[0].vm_sync);
+			sync[0].addr = to_user_pointer(vm_sync);
 			addr += bo_size;
 			if (bo)
 				xe_vm_bind_async(fd, vm, bind_exec_queues[e], bo,
@@ -213,9 +222,9 @@ test_exec(int fd, struct drm_xe_engine_class_instance *eci,
 							 to_user_pointer(data),
 							 addr, bo_size, sync,
 							 1);
-			xe_wait_ufence(fd, &data[0].vm_sync, USER_FENCE_VALUE,
+			xe_wait_ufence(fd, vm_sync, USER_FENCE_VALUE,
 				       bind_exec_queues[e], fence_timeout);
-			data[0].vm_sync = 0;
+			*vm_sync = 0;
 		}
 
 		if (flags & INVALIDATE && i + 1 != n_execs) {
@@ -264,10 +273,10 @@ test_exec(int fd, struct drm_xe_engine_class_instance *eci,
 	if (flags & INVALIDATE)
 		usleep(250000);
 
-	sync[0].addr = to_user_pointer(&data[0].vm_sync);
+	sync[0].addr = to_user_pointer(vm_sync);
 	xe_vm_unbind_async(fd, vm, bind_exec_queues[0], 0, addr, bo_size,
 			   sync, 1);
-	xe_wait_ufence(fd, &data[0].vm_sync, USER_FENCE_VALUE,
+	xe_wait_ufence(fd, vm_sync, USER_FENCE_VALUE,
 		       bind_exec_queues[0], fence_timeout);
 
 	for (i = j; i < n_execs; i++)
@@ -288,6 +297,8 @@ test_exec(int fd, struct drm_xe_engine_class_instance *eci,
 	xe_vm_destroy(fd, vm);
 	if (map_fd != -1)
 		close(map_fd);
+	if (flags & MALLOC_USER_FENCE)
+		free(vm_sync);
 }
 
 /**
@@ -408,6 +419,7 @@ igt_main
 		unsigned int flags;
 	} sections[] = {
 		{ "basic", 0 },
+		{ "malloc-ufence", MALLOC_USER_FENCE },
 		{ "preempt-fence-early", VM_FOR_BO | EXEC_QUEUE_EARLY },
 		{ "userptr", USERPTR },
 		{ "rebind", REBIND },
-- 
2.34.1



More information about the igt-dev mailing list