[igt-dev] [RFC PATCH i-g-t 1/1] tests/gem_mmap_offset: Exercise mapping to userptr

Janusz Krzysztofik janusz.krzysztofik at linux.intel.com
Fri Jan 31 13:12:34 UTC 2020


Creating a mapping to a userptr backed GEM object may cause a currently
unavoidable lockdep splat inside the i915 driver.  Then, such operation
is expected to fail to prevent from that badness to happen.

Add a respective subtest for each mapping type.

Signed-off-by: Janusz Krzysztofik <janusz.krzysztofik at linux.intel.com>
Cc: Matthew Auld <matthew.auld at intel.com>
Cc: Chris Wilson <chris at chris-wilson.co.uk>
---
 tests/i915/gem_mmap_offset.c | 55 ++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/tests/i915/gem_mmap_offset.c b/tests/i915/gem_mmap_offset.c
index 7c4088cdf..a5f28328b 100644
--- a/tests/i915/gem_mmap_offset.c
+++ b/tests/i915/gem_mmap_offset.c
@@ -141,6 +141,36 @@ static void bad_extensions(int i915)
 	gem_close(i915, arg.handle);
 }
 
+static bool has_userptr(int i915)
+{
+	uint32_t handle = 0;
+	void *ptr;
+
+	igt_assert_eq(posix_memalign(&ptr, 4096, 4096), 0);
+	if (__gem_userptr(i915, ptr, 4096, 0, 0, &handle) == 0)
+		gem_close(i915, handle);
+	free(ptr);
+
+	return handle;
+}
+
+static void userptr(int i915, uint64_t flags)
+{
+	struct drm_i915_gem_mmap_offset arg = {
+		.flags = flags,
+	};
+	void *ptr;
+
+	igt_assert_eq(posix_memalign(&ptr, 4096, 4096), 0);
+
+	gem_userptr(i915, ptr, 4096, 0, 0, &arg.handle);
+
+	igt_assert_eq(mmap_offset_ioctl(i915, &arg), -EINVAL);
+
+	gem_close(i915, arg.handle);
+	free(ptr);
+}
+
 static void basic_uaf(int i915)
 {
 	const uint32_t obj_size = 4096;
@@ -461,6 +491,31 @@ igt_main
 	igt_subtest_f("bad-extensions")
 		bad_extensions(i915);
 
+	igt_subtest_group {
+		igt_fixture
+			igt_require(has_userptr(i915));
+
+		for_each_mmap_offset_type(t) {
+			igt_describe_f("Verify %s mapping to userptr backed GEM object will fail",
+				       t->name);
+			igt_subtest_f("userptr-%s-mapping", t->name) {
+				switch (t->type) {
+				case I915_MMAP_OFFSET_GTT:
+					gem_require_mappable_ggtt(i915);
+					break;
+				case I915_MMAP_OFFSET_WC:
+				case I915_MMAP_OFFSET_UC:
+					igt_require(gem_mmap_offset__has_wc(i915));
+					break;
+				defalut:
+					break;
+				}
+
+				userptr(i915, t->type);
+			}
+		}
+	}
+
 	igt_describe("Check buffer object mapping persists after gem_close");
 	igt_subtest_f("basic-uaf")
 		basic_uaf(i915);
-- 
2.21.0



More information about the igt-dev mailing list