[igt-dev] [PATCH i-g-t v5 09/12] tests/i915/vm_bind: Add userptr subtest

Niranjana Vishwanathapura niranjana.vishwanathapura at intel.com
Mon Oct 31 21:30:29 UTC 2022


On Mon, Oct 31, 2022 at 03:46:10PM +0000, Matthew Auld wrote:
>On 25/10/2022 07:59, Niranjana Vishwanathapura wrote:
>>Add userptr object type to vm_bind_basic test.
>>
>>v2: Run all tests for userptr type
>>v3: Change info to debug messages, remove igt_collection usage
>>
>>Signed-off-by: Niranjana Vishwanathapura <niranjana.vishwanathapura at intel.com>
>
>>---
>>  tests/i915/i915_vm_bind_basic.c | 55 +++++++++++++++++++++++++++++----
>>  1 file changed, 49 insertions(+), 6 deletions(-)
>>
>>diff --git a/tests/i915/i915_vm_bind_basic.c b/tests/i915/i915_vm_bind_basic.c
>>index e794f0a845..f9cbb198e6 100644
>>--- a/tests/i915/i915_vm_bind_basic.c
>>+++ b/tests/i915/i915_vm_bind_basic.c
>>@@ -235,16 +235,24 @@ static uint32_t create_obj(int fd, struct gem_memory_region *mr, uint32_t size,
>>  {
>>  	uint32_t handle;
>>-	handle = gem_create_in_memory_region_list(fd, size, 0, &mr->ci, 1);
>>-	*addr = gem_mmap__cpu(fd, handle, 0, size, PROT_WRITE);
>>+	if (!mr) {
>>+		igt_assert(posix_memalign(addr, SZ_2M * MAX_CTXTS, size) == 0);
>>+		gem_userptr(fd, *addr, size, 0, 0, &handle);
>>+	} else {
>>+		handle = gem_create_in_memory_region_list(fd, size, 0, &mr->ci, 1);
>>+		*addr = gem_mmap__cpu(fd, handle, 0, size, PROT_WRITE);
>>+	}
>>  	return handle;
>>  }
>>-static void destroy_obj(int fd, uint32_t handle, uint32_t size, void *addr)
>>+static void destroy_obj(int fd, uint32_t handle, uint32_t size, void *addr, bool is_userptr)
>>  {
>>  	igt_assert(gem_munmap(addr, size) == 0);
>>  	gem_close(fd, handle);
>>+
>>+	if (is_userptr)
>>+		free(addr);
>>  }
>>  static void create_src_objs(int fd, struct gem_memory_region *mr, uint32_t src[],
>>@@ -255,6 +263,14 @@ static void create_src_objs(int fd, struct gem_memory_region *mr, uint32_t src[]
>>  	if (!num_cmds)
>>  		return;
>>+	if (!mr) {
>>+		for (i = 0; i < num_cmds; i++) {
>>+			src[i] = create_obj(fd, NULL, size, &src_addr[i]);
>>+			igt_debug("Src (userptr) obj 0x%x created\n", src[i]);
>>+		}
>>+		return;
>>+	}
>>+
>>  	/* Create first src object always in memory region 'mr' */
>>  	src[i] = create_obj(fd, mr, size, &src_addr[i]);
>>  	igt_debug("Src (%s) obj 0x%x created\n", mr->name, src[i]);
>>@@ -293,7 +309,7 @@ static void destroy_src_objs(int fd, struct gem_memory_region *mr, uint32_t src[
>>  	for (i = 0; i < num_cmds; i++) {
>>  		igt_debug("Closing src object 0x%x\n", src[i]);
>>-		destroy_obj(fd, src[i], size, src_addr[i]);
>>+		destroy_obj(fd, src[i], size, src_addr[i], !mr);
>>  	}
>>  }
>>@@ -301,7 +317,7 @@ static uint32_t create_dst_obj(int fd, struct gem_memory_region *mr, uint32_t si
>>  {
>>  	uint32_t dst = create_obj(fd, mr, size, dst_addr);
>>-	igt_debug("Dst (%s) obj 0x%x created\n", mr->name, dst);
>>+	igt_debug("Dst (%s) obj 0x%x created\n", mr ? mr->name : "userptr", dst);
>>  	return dst;
>>  }
>>@@ -309,7 +325,7 @@ static void destroy_dst_obj(int fd, struct gem_memory_region *mr, uint32_t dst,
>>  			    uint32_t size, void *dst_addr)
>>  {
>>  	igt_debug("Closing dst object 0x%x\n", dst);
>>-	destroy_obj(fd, dst, size, dst_addr);
>>+	destroy_obj(fd, dst, size, dst_addr, !mr);
>>  }
>>  static void pattern_fill_buf(void *src_addr[], uint32_t size, uint32_t num_cmds, uint32_t npages)
>>@@ -499,6 +515,25 @@ static void run_test(int fd, const intel_ctx_t *base_ctx, struct test_cfg *cfg,
>>  		gem_vm_destroy(fd, shared_vm_id);
>>  }
>>+static int has_userptr(int fd)
>>+{
>>+	uint32_t handle = 0;
>>+	void *ptr;
>>+	int ret;
>>+
>>+	assert(posix_memalign(&ptr, PAGE_SIZE, PAGE_SIZE) == 0);
>>+	ret = __gem_userptr(fd, ptr, PAGE_SIZE, 0, 0, &handle);
>>+	if (ret != 0) {
>>+		free(ptr);
>>+		return 0;
>>+	}
>>+
>>+	gem_close(fd, handle);
>>+	free(ptr);
>>+
>>+	return handle != 0;
>>+}
>>+
>>  igt_main
>>  {
>>  	struct test_cfg *t, tests[] = {
>>@@ -547,6 +582,14 @@ igt_main
>>  				igt_dynamic_f("%s", r->name)
>>  					run_test(fd, ctx, &cfg, r, alignment, e);
>>  			}
>>+
>>+			if (has_userptr(fd)) {
>
>It's probably fair to assume vm_bind support also means we have 
>userptr?  But I guess can't hurt to check.
>

Yah, I think so, but yah it doesn't hurt to check in case for somereason
we disable userptr.

>Reviewed-by: Matthew Auld <matthew.auld at intel.com>

Thanks,
Niranjana

>
>>+				struct test_cfg cfg = *t;
>>+
>>+				/* Use NULL memory region for userptr */
>>+				igt_dynamic("userptr")
>>+					run_test(fd, ctx, &cfg, NULL, PAGE_SIZE, e);
>>+			}
>>  		}
>>  	}


More information about the igt-dev mailing list