All of lore.kernel.org
 help / color / mirror / Atom feed
* [igt-dev] [PATCH i-g-t] tests/prime_mmap: Add support for local memory
@ 2021-10-06 11:06 apoorva1.singh
  2021-10-06 11:41 ` [igt-dev] ✗ Fi.CI.BAT: failure for " Patchwork
  2021-10-13 11:48 ` [igt-dev] [PATCH i-g-t] " Zbigniew Kempczyński
  0 siblings, 2 replies; 3+ messages in thread
From: apoorva1.singh @ 2021-10-06 11:06 UTC (permalink / raw)
  To: zbigniew.kempczynski, thomas.hellstrom, igt-dev, arjun.melkaveri

From: Andrzej Turko <andrzej.turko@linux.intel.com>

Add support for local memory region (Device memory)

Signed-off-by: Andrzej Turko <andrzej.turko@linux.intel.com>
Signed-off-by: Apoorva Singh <apoorva1.singh@intel.com>
Cc: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Melkaveri, Arjun <arjun.melkaveri@intel.com>
---
 tests/prime_mmap.c | 259 +++++++++++++++++++++++++++------------------
 1 file changed, 158 insertions(+), 101 deletions(-)

diff --git a/tests/prime_mmap.c b/tests/prime_mmap.c
index a4e4b4b6..9f3a1ad9 100644
--- a/tests/prime_mmap.c
+++ b/tests/prime_mmap.c
@@ -42,11 +42,14 @@
 
 #include "drm.h"
 #include "drmtest.h"
+#include "igt.h"
+#include "igt_collection.h"
 #include "i915_drm.h"
 #include "i915/gem_create.h"
 #include "i915/gem_mman.h"
 #include "igt_debugfs.h"
 #include "ioctl_wrappers.h"
+#include "i915/intel_memory_region.h"
 
 #define BO_SIZE (16*1024)
 
@@ -68,119 +71,123 @@ fill_bo(uint32_t handle, size_t size)
 }
 
 static void
-fill_bo_cpu(char *ptr)
+fill_bo_cpu(char *ptr, size_t size)
 {
-	memcpy(ptr, pattern, sizeof(pattern));
+	off_t i;
+	for (i = 0; i < size; i += sizeof(pattern))
+	{
+		memcpy(ptr + i, pattern, sizeof(pattern));
+	}
 }
 
 static void
-test_correct(void)
+test_correct(uint32_t region, int size)
 {
 	int dma_buf_fd;
 	char *ptr1, *ptr2;
 	uint32_t handle;
 
-	handle = gem_create(fd, BO_SIZE);
-	fill_bo(handle, BO_SIZE);
+	handle = gem_create_in_memory_regions(fd, size, region);
+	fill_bo(handle, size);
 
 	dma_buf_fd = prime_handle_to_fd(fd, handle);
 	igt_assert(errno == 0);
 
 	/* Check correctness vs GEM_MMAP */
-	ptr1 = gem_mmap__device_coherent(fd, handle, 0, BO_SIZE, PROT_READ);
-	ptr2 = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
+	ptr1 = gem_mmap__device_coherent(fd, handle, 0, size, PROT_READ);
+	ptr2 = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
 	igt_assert(ptr1 != MAP_FAILED);
 	igt_assert(ptr2 != MAP_FAILED);
-	igt_assert(memcmp(ptr1, ptr2, BO_SIZE) == 0);
+	igt_assert(memcmp(ptr1, ptr2, size) == 0);
 
 	/* Check pattern correctness */
 	igt_assert(memcmp(ptr2, pattern, sizeof(pattern)) == 0);
 
-	munmap(ptr1, BO_SIZE);
-	munmap(ptr2, BO_SIZE);
+	munmap(ptr1, size);
+	munmap(ptr2, size);
 	close(dma_buf_fd);
 	gem_close(fd, handle);
 }
 
 static void
-test_map_unmap(void)
+test_map_unmap(uint32_t region, int size)
 {
 	int dma_buf_fd;
 	char *ptr;
 	uint32_t handle;
 
-	handle = gem_create(fd, BO_SIZE);
-	fill_bo(handle, BO_SIZE);
+	handle = gem_create_in_memory_regions(fd, size, region);
+	fill_bo(handle, size);
 
 	dma_buf_fd = prime_handle_to_fd(fd, handle);
 	igt_assert(errno == 0);
 
-	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
+	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
 	igt_assert(ptr != MAP_FAILED);
 	igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
 
 	/* Unmap and remap */
-	munmap(ptr, BO_SIZE);
-	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
+	munmap(ptr, size);
+	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
 	igt_assert(ptr != MAP_FAILED);
 	igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
 
-	munmap(ptr, BO_SIZE);
+	munmap(ptr, size);
 	close(dma_buf_fd);
 	gem_close(fd, handle);
 }
 
 /* prime and then unprime and then prime again the same handle */
 static void
-test_reprime(void)
+test_reprime(uint32_t region, int size)
 {
 	int dma_buf_fd;
 	char *ptr;
 	uint32_t handle;
 
-	handle = gem_create(fd, BO_SIZE);
-	fill_bo(handle, BO_SIZE);
+	handle = gem_create_in_memory_regions(fd, size, region);
+	fill_bo(handle, size);
 
 	dma_buf_fd = prime_handle_to_fd(fd, handle);
 	igt_assert(errno == 0);
 
-	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
+	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
 	igt_assert(ptr != MAP_FAILED);
 	igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
 
 	close (dma_buf_fd);
 	igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
-	munmap(ptr, BO_SIZE);
+	munmap(ptr, size);
 
 	dma_buf_fd = prime_handle_to_fd(fd, handle);
-	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
+	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
 	igt_assert(ptr != MAP_FAILED);
 	igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
 
-	munmap(ptr, BO_SIZE);
+	munmap(ptr, size);
 	close(dma_buf_fd);
 	gem_close(fd, handle);
 }
 
 /* map from another process */
 static void
-test_forked(void)
+test_forked(uint32_t region, int size)
 {
 	int dma_buf_fd;
 	char *ptr;
 	uint32_t handle;
 
-	handle = gem_create(fd, BO_SIZE);
-	fill_bo(handle, BO_SIZE);
+	handle = gem_create_in_memory_regions(fd, size, region);
+	fill_bo(handle, size);
 
 	dma_buf_fd = prime_handle_to_fd(fd, handle);
 	igt_assert(errno == 0);
 
 	igt_fork(childno, 1) {
-		ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
+		ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
 		igt_assert(ptr != MAP_FAILED);
 		igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
-		munmap(ptr, BO_SIZE);
+		munmap(ptr, size);
 		close(dma_buf_fd);
 	}
 	close(dma_buf_fd);
@@ -190,13 +197,13 @@ test_forked(void)
 
 /* test simple CPU write */
 static void
-test_correct_cpu_write(void)
+test_correct_cpu_write(uint32_t region, int size)
 {
 	int dma_buf_fd;
 	char *ptr;
 	uint32_t handle;
 
-	handle = gem_create(fd, BO_SIZE);
+	handle = gem_create_in_memory_regions(fd, size, region);
 
 	dma_buf_fd = prime_handle_to_fd_for_mmap(fd, handle);
 
@@ -204,29 +211,30 @@ test_correct_cpu_write(void)
 	igt_skip_on(errno == EINVAL);
 
 	/* Check correctness of map using write protection (PROT_WRITE) */
-	ptr = mmap(NULL, BO_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, dma_buf_fd, 0);
+	ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, dma_buf_fd,
+		   0);
 	igt_assert(ptr != MAP_FAILED);
 
 	/* Fill bo using CPU */
-	fill_bo_cpu(ptr);
+	fill_bo_cpu(ptr, BO_SIZE);
 
 	/* Check pattern correctness */
 	igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
 
-	munmap(ptr, BO_SIZE);
+	munmap(ptr, size);
 	close(dma_buf_fd);
 	gem_close(fd, handle);
 }
 
 /* map from another process and then write using CPU */
 static void
-test_forked_cpu_write(void)
+test_forked_cpu_write(uint32_t region, int size)
 {
 	int dma_buf_fd;
 	char *ptr;
 	uint32_t handle;
 
-	handle = gem_create(fd, BO_SIZE);
+	handle = gem_create_in_memory_regions(fd, size, region);
 
 	dma_buf_fd = prime_handle_to_fd_for_mmap(fd, handle);
 
@@ -234,12 +242,13 @@ test_forked_cpu_write(void)
 	igt_skip_on(errno == EINVAL);
 
 	igt_fork(childno, 1) {
-		ptr = mmap(NULL, BO_SIZE, PROT_READ | PROT_WRITE , MAP_SHARED, dma_buf_fd, 0);
+		ptr = mmap(NULL, size, PROT_READ | PROT_WRITE , MAP_SHARED,
+			   dma_buf_fd, 0);
 		igt_assert(ptr != MAP_FAILED);
-		fill_bo_cpu(ptr);
+		fill_bo_cpu(ptr, BO_SIZE);
 
 		igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
-		munmap(ptr, BO_SIZE);
+		munmap(ptr, size);
 		close(dma_buf_fd);
 	}
 	close(dma_buf_fd);
@@ -248,45 +257,45 @@ test_forked_cpu_write(void)
 }
 
 static void
-test_refcounting(void)
+test_refcounting(uint32_t region, int size)
 {
 	int dma_buf_fd;
 	char *ptr;
 	uint32_t handle;
 
-	handle = gem_create(fd, BO_SIZE);
-	fill_bo(handle, BO_SIZE);
+	handle = gem_create_in_memory_regions(fd, size, region);
+	fill_bo(handle, size);
 
 	dma_buf_fd = prime_handle_to_fd(fd, handle);
 	igt_assert(errno == 0);
 	/* Close gem object before mapping */
 	gem_close(fd, handle);
 
-	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
+	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
 	igt_assert(ptr != MAP_FAILED);
 	igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
-	munmap(ptr, BO_SIZE);
+	munmap(ptr, size);
 	close (dma_buf_fd);
 }
 
 /* dup before mmap */
 static void
-test_dup(void)
+test_dup(uint32_t region, int size)
 {
 	int dma_buf_fd;
 	char *ptr;
 	uint32_t handle;
 
-	handle = gem_create(fd, BO_SIZE);
-	fill_bo(handle, BO_SIZE);
+	handle = gem_create_in_memory_regions(fd, size, region);
+	fill_bo(handle, size);
 
 	dma_buf_fd = dup(prime_handle_to_fd(fd, handle));
 	igt_assert(errno == 0);
 
-	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
+	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
 	igt_assert(ptr != MAP_FAILED);
 	igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
-	munmap(ptr, BO_SIZE);
+	munmap(ptr, size);
 	gem_close(fd, handle);
 	close (dma_buf_fd);
 }
@@ -324,21 +333,21 @@ static bool has_userptr(void)
 
 /* test for mmap(dma_buf_export(userptr)) */
 static void
-test_userptr(void)
+test_userptr(uint32_t region, int size)
 {
 	int ret, dma_buf_fd;
 	void *ptr;
 	uint32_t handle;
 
-	igt_require(has_userptr());
-
 	/* create userptr bo */
-	ret = posix_memalign(&ptr, 4096, BO_SIZE);
+	ret = posix_memalign(&ptr, 4096, size);
 	igt_assert_eq(ret, 0);
 
-	/* we are not allowed to export unsynchronized userptr. Just create a normal
-	 * one */
-	gem_userptr(fd, (uint32_t *)ptr, BO_SIZE, 0, 0, &handle);
+	/*
+	 * we are not allowed to export unsynchronized userptr. Just create a
+	 * normal one
+	 */
+	gem_userptr(fd, (uint32_t *)ptr, size, 0, 0, &handle);
 
 	/* export userptr */
 	ret = prime_handle_to_fd_no_assert(handle, DRM_CLOEXEC, &dma_buf_fd);
@@ -352,7 +361,7 @@ test_userptr(void)
 
 	/* a userptr doesn't have the obj->base.filp, but can be exported via
 	 * dma-buf, so make sure it fails here */
-	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
+	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
 	igt_assert(ptr == MAP_FAILED && errno == ENODEV);
 free_userptr:
 	gem_close(fd, handle);
@@ -360,7 +369,7 @@ free_userptr:
 }
 
 static void
-test_errors(void)
+test_errors(uint32_t region, int size)
 {
 	int i, dma_buf_fd;
 	char *ptr;
@@ -369,48 +378,50 @@ test_errors(void)
 	                       DRM_RDWR - 1, DRM_RDWR + 1};
 
 	/* Test for invalid flags */
-	handle = gem_create(fd, BO_SIZE);
-	for (i = 0; i < sizeof(invalid_flags) / sizeof(invalid_flags[0]); i++) {
-		prime_handle_to_fd_no_assert(handle, invalid_flags[i], &dma_buf_fd);
+	handle = gem_create_in_memory_regions(fd, size, region);
+	for (i = 0; i < ARRAY_SIZE(invalid_flags); i++) {
+		prime_handle_to_fd_no_assert(handle, invalid_flags[i],
+					     &dma_buf_fd);
 		igt_assert_eq(errno, EINVAL);
 		errno = 0;
 	}
+	gem_close(fd, handle);
 
 	/* Close gem object before priming */
-	handle = gem_create(fd, BO_SIZE);
-	fill_bo(handle, BO_SIZE);
+	handle = gem_create_in_memory_regions(fd, size, region);
+	fill_bo(handle, size);
 	gem_close(fd, handle);
 	prime_handle_to_fd_no_assert(handle, DRM_CLOEXEC, &dma_buf_fd);
 	igt_assert(dma_buf_fd == -1 && errno == ENOENT);
 	errno = 0;
 
 	/* close fd before mapping */
-	handle = gem_create(fd, BO_SIZE);
-	fill_bo(handle, BO_SIZE);
+	handle = gem_create_in_memory_regions(fd, size, region);
+	fill_bo(handle, size);
 	dma_buf_fd = prime_handle_to_fd(fd, handle);
 	igt_assert(errno == 0);
 	close(dma_buf_fd);
-	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
+	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
 	igt_assert(ptr == MAP_FAILED && errno == EBADF);
 	errno = 0;
 	gem_close(fd, handle);
 
 	/* Map too big */
-	handle = gem_create(fd, BO_SIZE);
-	fill_bo(handle, BO_SIZE);
+	handle = gem_create_in_memory_regions(fd, size, region);
+	fill_bo(handle, size);
 	dma_buf_fd = prime_handle_to_fd(fd, handle);
 	igt_assert(errno == 0);
-	ptr = mmap(NULL, BO_SIZE * 2, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
+	ptr = mmap(NULL, size * 2, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
 	igt_assert(ptr == MAP_FAILED && errno == EINVAL);
 	errno = 0;
 	close(dma_buf_fd);
 	gem_close(fd, handle);
 
 	/* Overlapping the end of the buffer */
-	handle = gem_create(fd, BO_SIZE);
+	handle = gem_create_in_memory_regions(fd, size, region);
 	dma_buf_fd = prime_handle_to_fd(fd, handle);
 	igt_assert(errno == 0);
-	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, BO_SIZE / 2);
+	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, size / 2);
 	igt_assert(ptr == MAP_FAILED && errno == EINVAL);
 	errno = 0;
 	close(dma_buf_fd);
@@ -419,7 +430,7 @@ test_errors(void)
 
 /* Test for invalid flags on sync ioctl */
 static void
-test_invalid_sync_flags(void)
+test_invalid_sync_flags(uint32_t region, int size)
 {
 	int i, dma_buf_fd;
 	uint32_t handle;
@@ -429,7 +440,7 @@ test_invalid_sync_flags(void)
 	                       LOCAL_DMA_BUF_SYNC_RW + 1,
 	                       LOCAL_DMA_BUF_SYNC_VALID_FLAGS_MASK + 1};
 
-	handle = gem_create(fd, BO_SIZE);
+	handle = gem_create_in_memory_regions(fd, size, region);
 	dma_buf_fd = prime_handle_to_fd(fd, handle);
 	for (i = 0; i < sizeof(invalid_flags) / sizeof(invalid_flags[0]); i++) {
 		memset(&sync, 0, sizeof(sync));
@@ -442,7 +453,7 @@ test_invalid_sync_flags(void)
 }
 
 static void
-test_aperture_limit(void)
+test_aperture_limit(uint32_t region, int size)
 {
 	int dma_buf_fd1, dma_buf_fd2;
 	char *ptr1, *ptr2;
@@ -452,23 +463,22 @@ test_aperture_limit(void)
 	uint64_t size2 = (gem_mappable_aperture_size(fd) * 3) / 8;
 
 	handle1 = gem_create(fd, size1);
-	fill_bo(handle1, BO_SIZE);
-
-	dma_buf_fd1 = prime_handle_to_fd(fd, handle1);
+	dma_buf_fd1 = prime_handle_to_fd_for_mmap(fd, handle1);
 	igt_assert(errno == 0);
-	ptr1 = mmap(NULL, size1, PROT_READ, MAP_SHARED, dma_buf_fd1, 0);
+	ptr1 = mmap(NULL, size1, PROT_READ | PROT_WRITE, MAP_SHARED, dma_buf_fd1, 0);
 	igt_assert(ptr1 != MAP_FAILED);
+	fill_bo_cpu(ptr1, size);
 	igt_assert(memcmp(ptr1, pattern, sizeof(pattern)) == 0);
 
 	handle2 = gem_create(fd, size1);
-	fill_bo(handle2, BO_SIZE);
-	dma_buf_fd2 = prime_handle_to_fd(fd, handle2);
+	dma_buf_fd2 = prime_handle_to_fd_for_mmap(fd, handle2);
 	igt_assert(errno == 0);
-	ptr2 = mmap(NULL, size2, PROT_READ, MAP_SHARED, dma_buf_fd2, 0);
+	ptr2 = mmap(NULL, size2, PROT_READ | PROT_WRITE, MAP_SHARED, dma_buf_fd2, 0);
 	igt_assert(ptr2 != MAP_FAILED);
+	fill_bo_cpu(ptr2, size);
 	igt_assert(memcmp(ptr2, pattern, sizeof(pattern)) == 0);
 
-	igt_assert(memcmp(ptr1, ptr2, BO_SIZE) == 0);
+	igt_assert(memcmp(ptr1, ptr2, size) == 0);
 
 	munmap(ptr1, size1);
 	munmap(ptr2, size2);
@@ -479,29 +489,55 @@ test_aperture_limit(void)
 }
 
 static int
-check_for_dma_buf_mmap(void)
+check_for_dma_buf_mmap(struct igt_collection *set)
 {
+	struct igt_collection *region;
+	uint32_t reg;
 	int dma_buf_fd;
 	char *ptr;
 	uint32_t handle;
 	int ret = 1;
 
-	handle = gem_create(fd, BO_SIZE);
-	dma_buf_fd = prime_handle_to_fd(fd, handle);
-	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
-	if (ptr != MAP_FAILED)
-		ret = 0;
-	munmap(ptr, BO_SIZE);
-	gem_close(fd, handle);
-	close(dma_buf_fd);
+	for_each_combination(region, 1, set) {
+		reg = igt_collection_get_value(region, 0);
+		handle = gem_create_in_memory_regions(fd, BO_SIZE, reg);
+
+		dma_buf_fd = prime_handle_to_fd(fd, handle);
+		ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
+		if (ptr != MAP_FAILED)
+			ret = 0;
+		munmap(ptr, BO_SIZE);
+		gem_close(fd, handle);
+		close(dma_buf_fd);
+	}
 	return ret;
 }
 
+#define SKIP_LMEM (1 << 0)
+#define SKIP_USERPTR (1 << 1)
+
+/*
+ * true skips the test
+ */
+static bool check_skip(uint32_t skip, uint32_t region)
+{
+	if ((skip & SKIP_LMEM) && IS_DEVICE_MEMORY_REGION(region))
+		return true;
+
+	if (skip & SKIP_USERPTR)
+		return !has_userptr();
+
+	return false;
+}
+
 igt_main
 {
+	struct igt_collection *set, *regions;
+	struct drm_i915_query_memory_regions *query_info;
 	struct {
 		const char *name;
-		void (*fn)(void);
+		void (*fn)(uint32_t, int);
+		uint32_t skip;
 	} tests[] = {
 		{ "test_correct", test_correct },
 		{ "test_map_unmap", test_map_unmap },
@@ -511,25 +547,46 @@ igt_main
 		{ "test_forked_cpu_write", test_forked_cpu_write },
 		{ "test_refcounting", test_refcounting },
 		{ "test_dup", test_dup },
-		{ "test_userptr", test_userptr },
+		{ "test_userptr", test_userptr, SKIP_LMEM | SKIP_USERPTR },
 		{ "test_errors", test_errors },
 		{ "test_invalid_sync_flags", test_invalid_sync_flags },
-		{ "test_aperture_limit", test_aperture_limit },
+		{ "test_aperture_limit", test_aperture_limit, SKIP_LMEM },
 	};
+	uint32_t region;
+	char *ext;
+	int size;
 	int i;
 
 	igt_fixture {
 		fd = drm_open_driver(DRIVER_INTEL);
-		igt_skip_on((check_for_dma_buf_mmap() != 0));
-		errno = 0;
-	}
 
+		query_info = gem_get_query_memory_regions(fd);
+		igt_assert(query_info);
 
-	for (i = 0; i < ARRAY_SIZE(tests); i++) {
-		igt_subtest(tests[i].name)
-			tests[i].fn();
+		set = get_memory_region_set(query_info, I915_SYSTEM_MEMORY,
+					    I915_DEVICE_MEMORY);
+		igt_skip_on((check_for_dma_buf_mmap(set) != 0));
+		errno = 0;
 	}
 
-	igt_fixture
+	for (i = 0; i < ARRAY_SIZE(tests); i++)
+		igt_subtest_with_dynamic(tests[i].name) {
+			for_each_combination(regions, 1, set) {
+				region = igt_collection_get_value(regions, 0);
+				size = gem_get_batch_size(fd, MEMORY_TYPE_FROM_REGION(region));
+				size = max(size, BO_SIZE);
+				if (check_skip(tests[i].skip, region))
+					continue;
+				ext = memregion_dynamic_subtest_name(regions);
+				igt_dynamic_f("%s-%s", tests[i].name, ext)
+					tests[i].fn(region, size);
+				free(ext);
+			}
+		}
+
+	igt_fixture {
+		free(query_info);
+		igt_collection_destroy(set);
 		close(fd);
+	}
 }
-- 
2.25.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [igt-dev] ✗ Fi.CI.BAT: failure for tests/prime_mmap: Add support for local memory
  2021-10-06 11:06 [igt-dev] [PATCH i-g-t] tests/prime_mmap: Add support for local memory apoorva1.singh
@ 2021-10-06 11:41 ` Patchwork
  2021-10-13 11:48 ` [igt-dev] [PATCH i-g-t] " Zbigniew Kempczyński
  1 sibling, 0 replies; 3+ messages in thread
From: Patchwork @ 2021-10-06 11:41 UTC (permalink / raw)
  To: apoorva1.singh; +Cc: igt-dev

[-- Attachment #1: Type: text/plain, Size: 6149 bytes --]

== Series Details ==

Series: tests/prime_mmap: Add support for local memory
URL   : https://patchwork.freedesktop.org/series/95508/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_10688 -> IGTPW_6293
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with IGTPW_6293 absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in IGTPW_6293, please notify your bug team to allow them
  to document this new failure mode, which will reduce false positives in CI.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_6293/index.html

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in IGTPW_6293:

### IGT changes ###

#### Possible regressions ####

  * igt@core_hotunplug@unbind-rebind:
    - fi-tgl-u2:          [PASS][1] -> [INCOMPLETE][2]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_10688/fi-tgl-u2/igt@core_hotunplug@unbind-rebind.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_6293/fi-tgl-u2/igt@core_hotunplug@unbind-rebind.html

  
Known issues
------------

  Here are the changes found in IGTPW_6293 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@amdgpu/amd_basic@semaphore:
    - fi-bdw-5557u:       NOTRUN -> [SKIP][3] ([fdo#109271]) +27 similar issues
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_6293/fi-bdw-5557u/igt@amdgpu/amd_basic@semaphore.html

  * igt@amdgpu/amd_cs_nop@sync-fork-compute0:
    - fi-snb-2600:        NOTRUN -> [SKIP][4] ([fdo#109271]) +17 similar issues
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_6293/fi-snb-2600/igt@amdgpu/amd_cs_nop@sync-fork-compute0.html

  * igt@core_hotunplug@unbind-rebind:
    - fi-bdw-5557u:       NOTRUN -> [WARN][5] ([i915#3718])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_6293/fi-bdw-5557u/igt@core_hotunplug@unbind-rebind.html

  * igt@kms_chamelium@dp-crc-fast:
    - fi-bdw-5557u:       NOTRUN -> [SKIP][6] ([fdo#109271] / [fdo#111827]) +8 similar issues
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_6293/fi-bdw-5557u/igt@kms_chamelium@dp-crc-fast.html

  * igt@kms_frontbuffer_tracking@basic:
    - fi-cml-u2:          [PASS][7] -> [DMESG-WARN][8] ([i915#95])
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_10688/fi-cml-u2/igt@kms_frontbuffer_tracking@basic.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_6293/fi-cml-u2/igt@kms_frontbuffer_tracking@basic.html

  * igt@runner@aborted:
    - fi-tgl-u2:          NOTRUN -> [FAIL][9] ([i915#1602] / [i915#2722])
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_6293/fi-tgl-u2/igt@runner@aborted.html

  
#### Possible fixes ####

  * igt@i915_pm_rpm@module-reload:
    - {fi-tgl-dsi}:       [DMESG-WARN][10] ([i915#1982] / [i915#2411]) -> [PASS][11]
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_10688/fi-tgl-dsi/igt@i915_pm_rpm@module-reload.html
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_6293/fi-tgl-dsi/igt@i915_pm_rpm@module-reload.html

  * igt@i915_selftest@live@hangcheck:
    - {fi-hsw-gt1}:       [DMESG-WARN][12] ([i915#3303]) -> [PASS][13]
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_10688/fi-hsw-gt1/igt@i915_selftest@live@hangcheck.html
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_6293/fi-hsw-gt1/igt@i915_selftest@live@hangcheck.html
    - fi-snb-2600:        [INCOMPLETE][14] ([i915#3921]) -> [PASS][15]
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_10688/fi-snb-2600/igt@i915_selftest@live@hangcheck.html
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_6293/fi-snb-2600/igt@i915_selftest@live@hangcheck.html

  * igt@kms_flip@basic-plain-flip@c-dp1:
    - fi-cfl-8109u:       [FAIL][16] ([i915#4165]) -> [PASS][17]
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_10688/fi-cfl-8109u/igt@kms_flip@basic-plain-flip@c-dp1.html
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_6293/fi-cfl-8109u/igt@kms_flip@basic-plain-flip@c-dp1.html

  * igt@kms_pipe_crc_basic@compare-crc-sanitycheck-pipe-b:
    - fi-cfl-8109u:       [DMESG-WARN][18] ([i915#295]) -> [PASS][19] +14 similar issues
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_10688/fi-cfl-8109u/igt@kms_pipe_crc_basic@compare-crc-sanitycheck-pipe-b.html
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_6293/fi-cfl-8109u/igt@kms_pipe_crc_basic@compare-crc-sanitycheck-pipe-b.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [i915#1602]: https://gitlab.freedesktop.org/drm/intel/issues/1602
  [i915#1982]: https://gitlab.freedesktop.org/drm/intel/issues/1982
  [i915#2411]: https://gitlab.freedesktop.org/drm/intel/issues/2411
  [i915#2722]: https://gitlab.freedesktop.org/drm/intel/issues/2722
  [i915#295]: https://gitlab.freedesktop.org/drm/intel/issues/295
  [i915#3303]: https://gitlab.freedesktop.org/drm/intel/issues/3303
  [i915#3718]: https://gitlab.freedesktop.org/drm/intel/issues/3718
  [i915#3921]: https://gitlab.freedesktop.org/drm/intel/issues/3921
  [i915#4165]: https://gitlab.freedesktop.org/drm/intel/issues/4165
  [i915#95]: https://gitlab.freedesktop.org/drm/intel/issues/95


Participating hosts (45 -> 38)
------------------------------

  Missing    (7): fi-ilk-m540 bat-dg1-6 fi-hsw-4200u fi-bsw-cyan fi-ilk-650 fi-ctg-p8600 bat-jsl-1 


Build changes
-------------

  * CI: CI-20190529 -> None
  * IGT: IGT_6233 -> IGTPW_6293

  CI-20190529: 20190529
  CI_DRM_10688: 639fd9206601fb81fbddc3a6f8d2d89816a8ba68 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_6293: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_6293/index.html
  IGT_6233: a2e7a4583f0f68218c53cfe7b0ea8cc34b49cae9 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_6293/index.html

[-- Attachment #2: Type: text/html, Size: 7184 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [igt-dev] [PATCH i-g-t] tests/prime_mmap: Add support for local memory
  2021-10-06 11:06 [igt-dev] [PATCH i-g-t] tests/prime_mmap: Add support for local memory apoorva1.singh
  2021-10-06 11:41 ` [igt-dev] ✗ Fi.CI.BAT: failure for " Patchwork
@ 2021-10-13 11:48 ` Zbigniew Kempczyński
  1 sibling, 0 replies; 3+ messages in thread
From: Zbigniew Kempczyński @ 2021-10-13 11:48 UTC (permalink / raw)
  To: apoorva1.singh; +Cc: thomas.hellstrom, igt-dev, arjun.melkaveri

On Wed, Oct 06, 2021 at 04:36:43PM +0530, apoorva1.singh@intel.com wrote:
> From: Andrzej Turko <andrzej.turko@linux.intel.com>
> 
> Add support for local memory region (Device memory)
> 
> Signed-off-by: Andrzej Turko <andrzej.turko@linux.intel.com>
> Signed-off-by: Apoorva Singh <apoorva1.singh@intel.com>
> Cc: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
> Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> Cc: Melkaveri, Arjun <arjun.melkaveri@intel.com>
> ---
>  tests/prime_mmap.c | 259 +++++++++++++++++++++++++++------------------
>  1 file changed, 158 insertions(+), 101 deletions(-)
> 
> diff --git a/tests/prime_mmap.c b/tests/prime_mmap.c
> index a4e4b4b6..9f3a1ad9 100644
> --- a/tests/prime_mmap.c
> +++ b/tests/prime_mmap.c
> @@ -42,11 +42,14 @@
>  
>  #include "drm.h"
>  #include "drmtest.h"
> +#include "igt.h"
> +#include "igt_collection.h"
>  #include "i915_drm.h"
>  #include "i915/gem_create.h"
>  #include "i915/gem_mman.h"
>  #include "igt_debugfs.h"
>  #include "ioctl_wrappers.h"
> +#include "i915/intel_memory_region.h"
>  
>  #define BO_SIZE (16*1024)
>  
> @@ -68,119 +71,123 @@ fill_bo(uint32_t handle, size_t size)
>  }
>  
>  static void
> -fill_bo_cpu(char *ptr)
> +fill_bo_cpu(char *ptr, size_t size)
>  {
> -	memcpy(ptr, pattern, sizeof(pattern));
> +	off_t i;
> +	for (i = 0; i < size; i += sizeof(pattern))
> +	{
> +		memcpy(ptr + i, pattern, sizeof(pattern));
> +	}
>  }
>  
>  static void
> -test_correct(void)
> +test_correct(uint32_t region, int size)
>  {
>  	int dma_buf_fd;
>  	char *ptr1, *ptr2;
>  	uint32_t handle;
>  
> -	handle = gem_create(fd, BO_SIZE);
> -	fill_bo(handle, BO_SIZE);
> +	handle = gem_create_in_memory_regions(fd, size, region);
> +	fill_bo(handle, size);
>  
>  	dma_buf_fd = prime_handle_to_fd(fd, handle);
>  	igt_assert(errno == 0);
>  
>  	/* Check correctness vs GEM_MMAP */
> -	ptr1 = gem_mmap__device_coherent(fd, handle, 0, BO_SIZE, PROT_READ);
> -	ptr2 = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
> +	ptr1 = gem_mmap__device_coherent(fd, handle, 0, size, PROT_READ);
> +	ptr2 = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
>  	igt_assert(ptr1 != MAP_FAILED);
>  	igt_assert(ptr2 != MAP_FAILED);
> -	igt_assert(memcmp(ptr1, ptr2, BO_SIZE) == 0);
> +	igt_assert(memcmp(ptr1, ptr2, size) == 0);
>  
>  	/* Check pattern correctness */
>  	igt_assert(memcmp(ptr2, pattern, sizeof(pattern)) == 0);
>  
> -	munmap(ptr1, BO_SIZE);
> -	munmap(ptr2, BO_SIZE);
> +	munmap(ptr1, size);
> +	munmap(ptr2, size);
>  	close(dma_buf_fd);
>  	gem_close(fd, handle);
>  }
>  
>  static void
> -test_map_unmap(void)
> +test_map_unmap(uint32_t region, int size)
>  {
>  	int dma_buf_fd;
>  	char *ptr;
>  	uint32_t handle;
>  
> -	handle = gem_create(fd, BO_SIZE);
> -	fill_bo(handle, BO_SIZE);
> +	handle = gem_create_in_memory_regions(fd, size, region);
> +	fill_bo(handle, size);
>  
>  	dma_buf_fd = prime_handle_to_fd(fd, handle);
>  	igt_assert(errno == 0);
>  
> -	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
> +	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
>  	igt_assert(ptr != MAP_FAILED);
>  	igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
>  
>  	/* Unmap and remap */
> -	munmap(ptr, BO_SIZE);
> -	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
> +	munmap(ptr, size);
> +	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
>  	igt_assert(ptr != MAP_FAILED);
>  	igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
>  
> -	munmap(ptr, BO_SIZE);
> +	munmap(ptr, size);
>  	close(dma_buf_fd);
>  	gem_close(fd, handle);
>  }
>  
>  /* prime and then unprime and then prime again the same handle */
>  static void
> -test_reprime(void)
> +test_reprime(uint32_t region, int size)
>  {
>  	int dma_buf_fd;
>  	char *ptr;
>  	uint32_t handle;
>  
> -	handle = gem_create(fd, BO_SIZE);
> -	fill_bo(handle, BO_SIZE);
> +	handle = gem_create_in_memory_regions(fd, size, region);
> +	fill_bo(handle, size);
>  
>  	dma_buf_fd = prime_handle_to_fd(fd, handle);
>  	igt_assert(errno == 0);
>  
> -	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
> +	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
>  	igt_assert(ptr != MAP_FAILED);
>  	igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
>  
>  	close (dma_buf_fd);
>  	igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
> -	munmap(ptr, BO_SIZE);
> +	munmap(ptr, size);
>  
>  	dma_buf_fd = prime_handle_to_fd(fd, handle);
> -	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
> +	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
>  	igt_assert(ptr != MAP_FAILED);
>  	igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
>  
> -	munmap(ptr, BO_SIZE);
> +	munmap(ptr, size);
>  	close(dma_buf_fd);
>  	gem_close(fd, handle);
>  }
>  
>  /* map from another process */
>  static void
> -test_forked(void)
> +test_forked(uint32_t region, int size)
>  {
>  	int dma_buf_fd;
>  	char *ptr;
>  	uint32_t handle;
>  
> -	handle = gem_create(fd, BO_SIZE);
> -	fill_bo(handle, BO_SIZE);
> +	handle = gem_create_in_memory_regions(fd, size, region);
> +	fill_bo(handle, size);
>  
>  	dma_buf_fd = prime_handle_to_fd(fd, handle);
>  	igt_assert(errno == 0);
>  
>  	igt_fork(childno, 1) {
> -		ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
> +		ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
>  		igt_assert(ptr != MAP_FAILED);
>  		igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
> -		munmap(ptr, BO_SIZE);
> +		munmap(ptr, size);
>  		close(dma_buf_fd);
>  	}
>  	close(dma_buf_fd);
> @@ -190,13 +197,13 @@ test_forked(void)
>  
>  /* test simple CPU write */
>  static void
> -test_correct_cpu_write(void)
> +test_correct_cpu_write(uint32_t region, int size)
>  {
>  	int dma_buf_fd;
>  	char *ptr;
>  	uint32_t handle;
>  
> -	handle = gem_create(fd, BO_SIZE);
> +	handle = gem_create_in_memory_regions(fd, size, region);
>  
>  	dma_buf_fd = prime_handle_to_fd_for_mmap(fd, handle);
>  
> @@ -204,29 +211,30 @@ test_correct_cpu_write(void)
>  	igt_skip_on(errno == EINVAL);
>  
>  	/* Check correctness of map using write protection (PROT_WRITE) */
> -	ptr = mmap(NULL, BO_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, dma_buf_fd, 0);
> +	ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, dma_buf_fd,
> +		   0);

Don't wrap here, as size has less characters than original line.

>  	igt_assert(ptr != MAP_FAILED);
>  
>  	/* Fill bo using CPU */
> -	fill_bo_cpu(ptr);
> +	fill_bo_cpu(ptr, BO_SIZE);
>  
>  	/* Check pattern correctness */
>  	igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
>  
> -	munmap(ptr, BO_SIZE);
> +	munmap(ptr, size);
>  	close(dma_buf_fd);
>  	gem_close(fd, handle);
>  }
>  
>  /* map from another process and then write using CPU */
>  static void
> -test_forked_cpu_write(void)
> +test_forked_cpu_write(uint32_t region, int size)
>  {
>  	int dma_buf_fd;
>  	char *ptr;
>  	uint32_t handle;
>  
> -	handle = gem_create(fd, BO_SIZE);
> +	handle = gem_create_in_memory_regions(fd, size, region);
>  
>  	dma_buf_fd = prime_handle_to_fd_for_mmap(fd, handle);
>  
> @@ -234,12 +242,13 @@ test_forked_cpu_write(void)
>  	igt_skip_on(errno == EINVAL);
>  
>  	igt_fork(childno, 1) {
> -		ptr = mmap(NULL, BO_SIZE, PROT_READ | PROT_WRITE , MAP_SHARED, dma_buf_fd, 0);
> +		ptr = mmap(NULL, size, PROT_READ | PROT_WRITE , MAP_SHARED,
> +			   dma_buf_fd, 0);

Same.

>  		igt_assert(ptr != MAP_FAILED);
> -		fill_bo_cpu(ptr);
> +		fill_bo_cpu(ptr, BO_SIZE);
>  
>  		igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
> -		munmap(ptr, BO_SIZE);
> +		munmap(ptr, size);
>  		close(dma_buf_fd);
>  	}
>  	close(dma_buf_fd);
> @@ -248,45 +257,45 @@ test_forked_cpu_write(void)
>  }
>  
>  static void
> -test_refcounting(void)
> +test_refcounting(uint32_t region, int size)
>  {
>  	int dma_buf_fd;
>  	char *ptr;
>  	uint32_t handle;
>  
> -	handle = gem_create(fd, BO_SIZE);
> -	fill_bo(handle, BO_SIZE);
> +	handle = gem_create_in_memory_regions(fd, size, region);
> +	fill_bo(handle, size);
>  
>  	dma_buf_fd = prime_handle_to_fd(fd, handle);
>  	igt_assert(errno == 0);
>  	/* Close gem object before mapping */
>  	gem_close(fd, handle);
>  
> -	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
> +	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
>  	igt_assert(ptr != MAP_FAILED);
>  	igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
> -	munmap(ptr, BO_SIZE);
> +	munmap(ptr, size);
>  	close (dma_buf_fd);
>  }
>  
>  /* dup before mmap */
>  static void
> -test_dup(void)
> +test_dup(uint32_t region, int size)
>  {
>  	int dma_buf_fd;
>  	char *ptr;
>  	uint32_t handle;
>  
> -	handle = gem_create(fd, BO_SIZE);
> -	fill_bo(handle, BO_SIZE);
> +	handle = gem_create_in_memory_regions(fd, size, region);
> +	fill_bo(handle, size);
>  
>  	dma_buf_fd = dup(prime_handle_to_fd(fd, handle));
>  	igt_assert(errno == 0);
>  
> -	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
> +	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
>  	igt_assert(ptr != MAP_FAILED);
>  	igt_assert(memcmp(ptr, pattern, sizeof(pattern)) == 0);
> -	munmap(ptr, BO_SIZE);
> +	munmap(ptr, size);
>  	gem_close(fd, handle);
>  	close (dma_buf_fd);
>  }
> @@ -324,21 +333,21 @@ static bool has_userptr(void)
>  
>  /* test for mmap(dma_buf_export(userptr)) */
>  static void
> -test_userptr(void)
> +test_userptr(uint32_t region, int size)
>  {
>  	int ret, dma_buf_fd;
>  	void *ptr;
>  	uint32_t handle;
>  
> -	igt_require(has_userptr());
> -
>  	/* create userptr bo */
> -	ret = posix_memalign(&ptr, 4096, BO_SIZE);
> +	ret = posix_memalign(&ptr, 4096, size);
>  	igt_assert_eq(ret, 0);
>  
> -	/* we are not allowed to export unsynchronized userptr. Just create a normal
> -	 * one */
> -	gem_userptr(fd, (uint32_t *)ptr, BO_SIZE, 0, 0, &handle);
> +	/*
> +	 * we are not allowed to export unsynchronized userptr. Just create a
> +	 * normal one
> +	 */
> +	gem_userptr(fd, (uint32_t *)ptr, size, 0, 0, &handle);
>  
>  	/* export userptr */
>  	ret = prime_handle_to_fd_no_assert(handle, DRM_CLOEXEC, &dma_buf_fd);
> @@ -352,7 +361,7 @@ test_userptr(void)
>  
>  	/* a userptr doesn't have the obj->base.filp, but can be exported via
>  	 * dma-buf, so make sure it fails here */
> -	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
> +	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
>  	igt_assert(ptr == MAP_FAILED && errno == ENODEV);
>  free_userptr:
>  	gem_close(fd, handle);
> @@ -360,7 +369,7 @@ free_userptr:
>  }
>  
>  static void
> -test_errors(void)
> +test_errors(uint32_t region, int size)
>  {
>  	int i, dma_buf_fd;
>  	char *ptr;
> @@ -369,48 +378,50 @@ test_errors(void)
>  	                       DRM_RDWR - 1, DRM_RDWR + 1};
>  
>  	/* Test for invalid flags */
> -	handle = gem_create(fd, BO_SIZE);
> -	for (i = 0; i < sizeof(invalid_flags) / sizeof(invalid_flags[0]); i++) {
> -		prime_handle_to_fd_no_assert(handle, invalid_flags[i], &dma_buf_fd);
> +	handle = gem_create_in_memory_regions(fd, size, region);
> +	for (i = 0; i < ARRAY_SIZE(invalid_flags); i++) {
> +		prime_handle_to_fd_no_assert(handle, invalid_flags[i],
> +					     &dma_buf_fd);

Same, don't wrap the line.

>  		igt_assert_eq(errno, EINVAL);
>  		errno = 0;
>  	}
> +	gem_close(fd, handle);

Good spotted, we got handle leak before. 

>  
>  	/* Close gem object before priming */
> -	handle = gem_create(fd, BO_SIZE);
> -	fill_bo(handle, BO_SIZE);
> +	handle = gem_create_in_memory_regions(fd, size, region);
> +	fill_bo(handle, size);
>  	gem_close(fd, handle);
>  	prime_handle_to_fd_no_assert(handle, DRM_CLOEXEC, &dma_buf_fd);
>  	igt_assert(dma_buf_fd == -1 && errno == ENOENT);
>  	errno = 0;
>  
>  	/* close fd before mapping */
> -	handle = gem_create(fd, BO_SIZE);
> -	fill_bo(handle, BO_SIZE);
> +	handle = gem_create_in_memory_regions(fd, size, region);
> +	fill_bo(handle, size);
>  	dma_buf_fd = prime_handle_to_fd(fd, handle);
>  	igt_assert(errno == 0);
>  	close(dma_buf_fd);
> -	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
> +	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
>  	igt_assert(ptr == MAP_FAILED && errno == EBADF);
>  	errno = 0;
>  	gem_close(fd, handle);
>  
>  	/* Map too big */
> -	handle = gem_create(fd, BO_SIZE);
> -	fill_bo(handle, BO_SIZE);
> +	handle = gem_create_in_memory_regions(fd, size, region);
> +	fill_bo(handle, size);
>  	dma_buf_fd = prime_handle_to_fd(fd, handle);
>  	igt_assert(errno == 0);
> -	ptr = mmap(NULL, BO_SIZE * 2, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
> +	ptr = mmap(NULL, size * 2, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
>  	igt_assert(ptr == MAP_FAILED && errno == EINVAL);
>  	errno = 0;
>  	close(dma_buf_fd);
>  	gem_close(fd, handle);
>  
>  	/* Overlapping the end of the buffer */
> -	handle = gem_create(fd, BO_SIZE);
> +	handle = gem_create_in_memory_regions(fd, size, region);
>  	dma_buf_fd = prime_handle_to_fd(fd, handle);
>  	igt_assert(errno == 0);
> -	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, BO_SIZE / 2);
> +	ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, dma_buf_fd, size / 2);
>  	igt_assert(ptr == MAP_FAILED && errno == EINVAL);
>  	errno = 0;
>  	close(dma_buf_fd);
> @@ -419,7 +430,7 @@ test_errors(void)
>  
>  /* Test for invalid flags on sync ioctl */
>  static void
> -test_invalid_sync_flags(void)
> +test_invalid_sync_flags(uint32_t region, int size)
>  {
>  	int i, dma_buf_fd;
>  	uint32_t handle;
> @@ -429,7 +440,7 @@ test_invalid_sync_flags(void)
>  	                       LOCAL_DMA_BUF_SYNC_RW + 1,
>  	                       LOCAL_DMA_BUF_SYNC_VALID_FLAGS_MASK + 1};
>  
> -	handle = gem_create(fd, BO_SIZE);
> +	handle = gem_create_in_memory_regions(fd, size, region);
>  	dma_buf_fd = prime_handle_to_fd(fd, handle);
>  	for (i = 0; i < sizeof(invalid_flags) / sizeof(invalid_flags[0]); i++) {
>  		memset(&sync, 0, sizeof(sync));
> @@ -442,7 +453,7 @@ test_invalid_sync_flags(void)
>  }
>  
>  static void
> -test_aperture_limit(void)
> +test_aperture_limit(uint32_t region, int size)
>  {
>  	int dma_buf_fd1, dma_buf_fd2;
>  	char *ptr1, *ptr2;
> @@ -452,23 +463,22 @@ test_aperture_limit(void)
>  	uint64_t size2 = (gem_mappable_aperture_size(fd) * 3) / 8;
>  
>  	handle1 = gem_create(fd, size1);
> -	fill_bo(handle1, BO_SIZE);
> -
> -	dma_buf_fd1 = prime_handle_to_fd(fd, handle1);
> +	dma_buf_fd1 = prime_handle_to_fd_for_mmap(fd, handle1);
>  	igt_assert(errno == 0);
> -	ptr1 = mmap(NULL, size1, PROT_READ, MAP_SHARED, dma_buf_fd1, 0);
> +	ptr1 = mmap(NULL, size1, PROT_READ | PROT_WRITE, MAP_SHARED, dma_buf_fd1, 0);
>  	igt_assert(ptr1 != MAP_FAILED);
> +	fill_bo_cpu(ptr1, size);
>  	igt_assert(memcmp(ptr1, pattern, sizeof(pattern)) == 0);
>  
>  	handle2 = gem_create(fd, size1);
> -	fill_bo(handle2, BO_SIZE);
> -	dma_buf_fd2 = prime_handle_to_fd(fd, handle2);
> +	dma_buf_fd2 = prime_handle_to_fd_for_mmap(fd, handle2);
>  	igt_assert(errno == 0);
> -	ptr2 = mmap(NULL, size2, PROT_READ, MAP_SHARED, dma_buf_fd2, 0);
> +	ptr2 = mmap(NULL, size2, PROT_READ | PROT_WRITE, MAP_SHARED, dma_buf_fd2, 0);
>  	igt_assert(ptr2 != MAP_FAILED);
> +	fill_bo_cpu(ptr2, size);
>  	igt_assert(memcmp(ptr2, pattern, sizeof(pattern)) == 0);
>  
> -	igt_assert(memcmp(ptr1, ptr2, BO_SIZE) == 0);
> +	igt_assert(memcmp(ptr1, ptr2, size) == 0);
>  
>  	munmap(ptr1, size1);
>  	munmap(ptr2, size2);
> @@ -479,29 +489,55 @@ test_aperture_limit(void)
>  }
>  
>  static int
> -check_for_dma_buf_mmap(void)
> +check_for_dma_buf_mmap(struct igt_collection *set)
>  {
> +	struct igt_collection *region;
> +	uint32_t reg;
>  	int dma_buf_fd;
>  	char *ptr;
>  	uint32_t handle;
>  	int ret = 1;
>  
> -	handle = gem_create(fd, BO_SIZE);
> -	dma_buf_fd = prime_handle_to_fd(fd, handle);
> -	ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
> -	if (ptr != MAP_FAILED)
> -		ret = 0;
> -	munmap(ptr, BO_SIZE);
> -	gem_close(fd, handle);
> -	close(dma_buf_fd);
> +	for_each_combination(region, 1, set) {
> +		reg = igt_collection_get_value(region, 0);
> +		handle = gem_create_in_memory_regions(fd, BO_SIZE, reg);
> +
> +		dma_buf_fd = prime_handle_to_fd(fd, handle);
> +		ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
> +		if (ptr != MAP_FAILED)
> +			ret = 0;
> +		munmap(ptr, BO_SIZE);
> +		gem_close(fd, handle);
> +		close(dma_buf_fd);
> +	}
>  	return ret;
>  }
>  
> +#define SKIP_LMEM (1 << 0)
> +#define SKIP_USERPTR (1 << 1)
> +
> +/*
> + * true skips the test
> + */
> +static bool check_skip(uint32_t skip, uint32_t region)
> +{
> +	if ((skip & SKIP_LMEM) && IS_DEVICE_MEMORY_REGION(region))
> +		return true;
> +
> +	if (skip & SKIP_USERPTR)
> +		return !has_userptr();
> +
> +	return false;
> +}
> +
>  igt_main
>  {
> +	struct igt_collection *set, *regions;
> +	struct drm_i915_query_memory_regions *query_info;
>  	struct {
>  		const char *name;
> -		void (*fn)(void);
> +		void (*fn)(uint32_t, int);
> +		uint32_t skip;
>  	} tests[] = {
>  		{ "test_correct", test_correct },
>  		{ "test_map_unmap", test_map_unmap },
> @@ -511,25 +547,46 @@ igt_main
>  		{ "test_forked_cpu_write", test_forked_cpu_write },
>  		{ "test_refcounting", test_refcounting },
>  		{ "test_dup", test_dup },
> -		{ "test_userptr", test_userptr },
> +		{ "test_userptr", test_userptr, SKIP_LMEM | SKIP_USERPTR },
>  		{ "test_errors", test_errors },
>  		{ "test_invalid_sync_flags", test_invalid_sync_flags },
> -		{ "test_aperture_limit", test_aperture_limit },
> +		{ "test_aperture_limit", test_aperture_limit, SKIP_LMEM },
>  	};
> +	uint32_t region;
> +	char *ext;
> +	int size;
>  	int i;
>  
>  	igt_fixture {
>  		fd = drm_open_driver(DRIVER_INTEL);
> -		igt_skip_on((check_for_dma_buf_mmap() != 0));
> -		errno = 0;
> -	}
>  
> +		query_info = gem_get_query_memory_regions(fd);
> +		igt_assert(query_info);
>  
> -	for (i = 0; i < ARRAY_SIZE(tests); i++) {
> -		igt_subtest(tests[i].name)
> -			tests[i].fn();
> +		set = get_memory_region_set(query_info, I915_SYSTEM_MEMORY,
> +					    I915_DEVICE_MEMORY);
> +		igt_skip_on((check_for_dma_buf_mmap(set) != 0));

I think you should assert here if there's no possibility to mmap
dmabuf underneath. I see ttm backend right now doesn't support
mmap so we should fail here instead skip. At the beginning I wanted
to keep this test as generic as possible but I see it is targeted
for i915 mostly (gem_*() calls)).

Test generally looks ok but it is not able to run on discrete 
right now on ttm backend. So add assert, fix minor nits above
and resend.
 
--
Zbigniew
> +		errno = 0;
>  	}
>  
> -	igt_fixture
> +	for (i = 0; i < ARRAY_SIZE(tests); i++)
> +		igt_subtest_with_dynamic(tests[i].name) {
> +			for_each_combination(regions, 1, set) {
> +				region = igt_collection_get_value(regions, 0);
> +				size = gem_get_batch_size(fd, MEMORY_TYPE_FROM_REGION(region));
> +				size = max(size, BO_SIZE);
> +				if (check_skip(tests[i].skip, region))
> +					continue;
> +				ext = memregion_dynamic_subtest_name(regions);
> +				igt_dynamic_f("%s-%s", tests[i].name, ext)
> +					tests[i].fn(region, size);
> +				free(ext);
> +			}
> +		}
> +
> +	igt_fixture {
> +		free(query_info);
> +		igt_collection_destroy(set);
>  		close(fd);
> +	}
>  }
> -- 
> 2.25.1
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-10-13 11:48 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-06 11:06 [igt-dev] [PATCH i-g-t] tests/prime_mmap: Add support for local memory apoorva1.singh
2021-10-06 11:41 ` [igt-dev] ✗ Fi.CI.BAT: failure for " Patchwork
2021-10-13 11:48 ` [igt-dev] [PATCH i-g-t] " Zbigniew Kempczyński

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.