[Intel-gfx] [PATCH igt] igt/gem_exec_fence: Check sync_file->status after the fence is signaled

Chris Wilson chris at chris-wilson.co.uk
Tue Jan 3 14:59:20 UTC 2017


After the fence is signaled, the status feed reports whether or not the
request completed successfully. We set this to -EIO if a hang was
detected.

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 tests/gem_exec_fence.c | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/tests/gem_exec_fence.c b/tests/gem_exec_fence.c
index ea007468..4fe1bcee 100644
--- a/tests/gem_exec_fence.c
+++ b/tests/gem_exec_fence.c
@@ -91,6 +91,46 @@ static void store(int fd, unsigned ring, int fence, uint32_t target, unsigned of
 	gem_close(fd, obj[BATCH].handle);
 }
 
+struct local_sync_fence_info {
+	char obj_name[32];
+	char driver_name[32];
+
+	__s32 status;
+	__u32 flags;
+
+	__u64 timestamp_ns;
+};
+
+struct local_sync_file_info {
+	char  name[32];
+
+	__s32 status;
+	__u32 flags;
+	__u32 num_fences;
+	__u32 pad;
+
+	__u64 sync_fence_info;
+};
+
+#define UABI_SYNC_IOC_MAGIC '>'
+#define LOCAL_SYNC_IOC_FILE_INFO        _IOWR(UABI_SYNC_IOC_MAGIC, 4, struct local_sync_file_info)
+
+#define FENCE_OK 1
+
+static int fence_status(int fence)
+{
+	struct local_sync_fence_info fence_info;
+	struct local_sync_file_info info = {
+		.num_fences = 1,
+		.sync_fence_info = to_user_pointer(&fence_info),
+	};
+
+	(void)ioctl(fence, LOCAL_SYNC_IOC_FILE_INFO, &info);
+	igt_assert(info.num_fences == 1);
+
+	return fence_info.status;
+}
+
 static int __gem_execbuf_wr(int fd, struct drm_i915_gem_execbuffer2 *execbuf)
 {
 	int err = 0;
@@ -194,6 +234,7 @@ static void test_fence_busy(int fd, unsigned ring, unsigned flags)
 	}
 
 	igt_assert(!gem_bo_busy(fd, obj.handle));
+	igt_assert_eq(fence_status(fence), flags & HANG ? -EIO : FENCE_OK);
 
 	close(fence);
 	gem_close(fd, obj.handle);
-- 
2.11.0



More information about the Intel-gfx mailing list