[igt-dev] [PATCH i-g-t] tests/gem_create: Test unaligned BO size update

Michał Winiarski michal.winiarski at intel.com
Tue Mar 26 16:32:56 UTC 2019


The driver is supposed to update the size when it's trying to outsmart
userspace. Let's test it, and tweak the __gem_create in order to control
its input.

Signed-off-by: Michał Winiarski <michal.winiarski at intel.com>
Cc: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Janusz Krzysztofik <janusz.krzysztofik at intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
---
 lib/ioctl_wrappers.c           | 19 ++++++++----------
 lib/ioctl_wrappers.h           |  2 +-
 tests/i915/gem_create.c        | 35 +++++++++++++++++++++++++---------
 tests/i915/gem_fd_exhaustion.c | 11 ++++++-----
 4 files changed, 41 insertions(+), 26 deletions(-)

diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c
index a66eb4bc..bb387a27 100644
--- a/lib/ioctl_wrappers.c
+++ b/lib/ioctl_wrappers.c
@@ -541,21 +541,16 @@ uint32_t gem_create_stolen(int fd, uint64_t size)
 	return create.handle;
 }
 
-int __gem_create(int fd, uint64_t size, uint32_t *handle)
+int __gem_create(int fd, struct drm_i915_gem_create *create)
 {
-	struct drm_i915_gem_create create = {
-		.size = size,
-	};
 	int err = 0;
 
-	if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_CREATE, &create) == 0) {
-		*handle = create.handle;
-	} else {
+	if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_CREATE, create) != 0) {
 		err = -errno;
 		igt_assume(err != 0);
 	}
-
 	errno = 0;
+
 	return err;
 }
 
@@ -571,11 +566,13 @@ int __gem_create(int fd, uint64_t size, uint32_t *handle)
  */
 uint32_t gem_create(int fd, uint64_t size)
 {
-	uint32_t handle;
+	struct drm_i915_gem_create create = {
+		.size = size,
+	};
 
-	igt_assert_eq(__gem_create(fd, size, &handle), 0);
+	igt_assert_eq(__gem_create(fd, &create), 0);
 
-	return handle;
+	return create.handle;
 }
 
 /**
diff --git a/lib/ioctl_wrappers.h b/lib/ioctl_wrappers.h
index ad93daff..8202374f 100644
--- a/lib/ioctl_wrappers.h
+++ b/lib/ioctl_wrappers.h
@@ -77,7 +77,7 @@ void gem_sync(int fd, uint32_t handle);
 bool gem_create__has_stolen_support(int fd);
 uint32_t __gem_create_stolen(int fd, uint64_t size);
 uint32_t gem_create_stolen(int fd, uint64_t size);
-int __gem_create(int fd, uint64_t size, uint32_t *handle);
+int __gem_create(int fd, struct drm_i915_gem_create *create);
 uint32_t gem_create(int fd, uint64_t size);
 void gem_execbuf_wr(int fd, struct drm_i915_gem_execbuffer2 *execbuf);
 int __gem_execbuf_wr(int fd, struct drm_i915_gem_execbuffer2 *execbuf);
diff --git a/tests/i915/gem_create.c b/tests/i915/gem_create.c
index 2a861ca8..057816a5 100644
--- a/tests/i915/gem_create.c
+++ b/tests/i915/gem_create.c
@@ -71,7 +71,7 @@ struct local_i915_gem_create_v2 {
 	uint32_t pad;
 #define I915_CREATE_PLACEMENT_STOLEN (1<<0)
 	uint32_t flags;
-} create;
+} create_v2;
 
 #define LOCAL_IOCTL_I915_GEM_CREATE       DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_CREATE, struct local_i915_gem_create_v2)
 
@@ -81,24 +81,26 @@ static void invalid_flag_test(int fd)
 
 	gem_require_stolen_support(fd);
 
-	create.handle = 0;
-	create.size = PAGE_SIZE;
-	create.flags = ~I915_CREATE_PLACEMENT_STOLEN;
-	ret = drmIoctl(fd, LOCAL_IOCTL_I915_GEM_CREATE, &create);
+	create_v2.handle = 0;
+	create_v2.size = PAGE_SIZE;
+	create_v2.flags = ~I915_CREATE_PLACEMENT_STOLEN;
+	ret = drmIoctl(fd, LOCAL_IOCTL_I915_GEM_CREATE, &create_v2);
 
 	igt_assert(ret <= 0);
 
-	create.flags = ~0;
-	ret = drmIoctl(fd, LOCAL_IOCTL_I915_GEM_CREATE, &create);
+	create_v2.flags = ~0;
+	ret = drmIoctl(fd, LOCAL_IOCTL_I915_GEM_CREATE, &create_v2);
 
 	igt_assert(ret <= 0);
 }
 
 static void invalid_size_test(int fd)
 {
-	uint32_t handle;
+	struct drm_i915_gem_create create = {
+		.size = 0,
+	};
 
-	igt_assert_eq(__gem_create(fd, 0, &handle), -EINVAL);
+	igt_assert_eq(__gem_create(fd, &create), -EINVAL);
 }
 
 /*
@@ -209,6 +211,18 @@ static void always_clear(int i915, int timeout)
 		pthread_join(thread[i], NULL);
 }
 
+static void size_update(int fd)
+{
+	int size_initial_nonaligned = 16;
+
+	struct drm_i915_gem_create create = {
+		.size = size_initial_nonaligned,
+	};
+
+	igt_assert_eq(__gem_create(fd, &create), 0);
+	igt_assert_neq(create.size, size_initial_nonaligned);
+}
+
 igt_main
 {
 	int fd = -1;
@@ -233,4 +247,7 @@ igt_main
 
 	igt_subtest("create-clear")
 		always_clear(fd, 30);
+
+	igt_subtest("create-size-update")
+		size_update(fd);
 }
diff --git a/tests/i915/gem_fd_exhaustion.c b/tests/i915/gem_fd_exhaustion.c
index 559590b1..05800a5d 100644
--- a/tests/i915/gem_fd_exhaustion.c
+++ b/tests/i915/gem_fd_exhaustion.c
@@ -100,16 +100,17 @@ igt_simple_main
 		igt_drop_root();
 
 		for (int i = 0; ; i++) {
+			struct drm_i915_gem_create create = {
+				.size = 4096,
+			};
 			int leak = open("/dev/null", O_RDONLY);
-			uint32_t handle;
 
-			if (__gem_create(fd, 4096, &handle) == 0)
-				gem_close(fd, handle);
+			if (__gem_create(fd, &create) == 0)
+				gem_close(fd, create.handle);
 
 			if (leak < 0) {
 				igt_info("fd exhaustion after %i rounds.\n", i);
-				igt_assert(__gem_create(fd, 4096,
-							&handle) < 0);
+				igt_assert(__gem_create(fd, &create) < 0);
 				break;
 			}
 		}
-- 
2.20.1



More information about the igt-dev mailing list