All of lore.kernel.org
 help / color / mirror / Atom feed
* [Intel-gfx] [PATCH i-g-t] i915: Exercise VM_WAIT ioctl
@ 2020-01-18 22:16 ` Chris Wilson
  0 siblings, 0 replies; 4+ messages in thread
From: Chris Wilson @ 2020-01-18 22:16 UTC (permalink / raw)
  To: intel-gfx; +Cc: igt-dev

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
---
 include/drm-uapi/i915_drm.h |  37 +++
 lib/igt_dummyload.c         |   2 +
 lib/igt_dummyload.h         |   5 +-
 tests/Makefile.sources      |   3 +
 tests/i915/gem_vm_wait.c    | 523 ++++++++++++++++++++++++++++++++++++
 tests/meson.build           |   1 +
 6 files changed, 569 insertions(+), 2 deletions(-)
 create mode 100644 tests/i915/gem_vm_wait.c

diff --git a/include/drm-uapi/i915_drm.h b/include/drm-uapi/i915_drm.h
index b94e991be..62e5ccd2c 100644
--- a/include/drm-uapi/i915_drm.h
+++ b/include/drm-uapi/i915_drm.h
@@ -359,6 +359,7 @@ typedef struct _drm_i915_sarea {
 #define DRM_I915_QUERY			0x39
 #define DRM_I915_GEM_VM_CREATE		0x3a
 #define DRM_I915_GEM_VM_DESTROY		0x3b
+#define DRM_I915_GEM_VM_WAIT		0x3c
 /* Must be kept compact -- no holes */
 
 #define DRM_IOCTL_I915_INIT		DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t)
@@ -422,6 +423,7 @@ typedef struct _drm_i915_sarea {
 #define DRM_IOCTL_I915_QUERY			DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_QUERY, struct drm_i915_query)
 #define DRM_IOCTL_I915_GEM_VM_CREATE	DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_VM_CREATE, struct drm_i915_gem_vm_control)
 #define DRM_IOCTL_I915_GEM_VM_DESTROY	DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_VM_DESTROY, struct drm_i915_gem_vm_control)
+#define DRM_IOCTL_I915_GEM_VM_WAIT	DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_VM_WAIT, struct drm_i915_gem_vm_wait)
 
 /* Allow drivers to submit batchbuffers directly to hardware, relying
  * on the security mechanisms provided by hardware.
@@ -1824,6 +1826,41 @@ struct drm_i915_gem_vm_control {
 	__u32 vm_id;
 };
 
+/*
+ * (*IOVA & MASK) OP (VALUE & MASK)
+ *
+ * OP:
+ * - EQ, NEQ
+ * - GT, GTE
+ * - LT, LTE
+ * - BEFORE, AFTER
+ *
+ */
+struct drm_i915_gem_vm_wait {
+	__u64 extensions;
+	__u64 iova;
+	__u32 vm_id;
+	__u16 op;
+#define I915_VM_WAIT_EQ		0
+#define I915_VM_WAIT_NEQ	1
+#define I915_VM_WAIT_GT		2
+#define I915_VM_WAIT_GTE	3
+#define I915_VM_WAIT_LT		4
+#define I915_VM_WAIT_LTE	5
+#define I915_VM_WAIT_BEFORE	6
+#define I915_VM_WAIT_AFTER	7
+#define I915_VM_WAIT_PASSED	8
+	__u16 flags;
+#define I915_VM_WAIT_ABSTIME 0x1
+	__u64 value;
+	__u64 mask;
+#define I915_VM_WAIT_U8		0xffu
+#define I915_VM_WAIT_U16	0xffffu
+#define I915_VM_WAIT_U32	0xfffffffful
+#define I915_VM_WAIT_U64	0xffffffffffffffffull
+	__u64 timeout;
+};
+
 struct drm_i915_reg_read {
 	/*
 	 * Register offset.
diff --git a/lib/igt_dummyload.c b/lib/igt_dummyload.c
index b7f4caca3..7bc37889b 100644
--- a/lib/igt_dummyload.c
+++ b/lib/igt_dummyload.c
@@ -176,6 +176,8 @@ emit_recursive_batch(igt_spin_t *spin,
 		}
 
 		*cs++ = 1;
+		if (opts->flags & IGT_SPIN_WAKE_RUN)
+			*cs++ = 0x2 << 23;
 
 		execbuf->buffer_count++;
 	}
diff --git a/lib/igt_dummyload.h b/lib/igt_dummyload.h
index 421ca183b..8264834ce 100644
--- a/lib/igt_dummyload.h
+++ b/lib/igt_dummyload.h
@@ -60,8 +60,9 @@ struct igt_spin_factory {
 #define IGT_SPIN_FENCE_IN      (1 << 0)
 #define IGT_SPIN_FENCE_OUT     (1 << 1)
 #define IGT_SPIN_POLL_RUN      (1 << 2)
-#define IGT_SPIN_FAST          (1 << 3)
-#define IGT_SPIN_NO_PREEMPTION (1 << 4)
+#define IGT_SPIN_WAKE_RUN      (1 << 3)
+#define IGT_SPIN_FAST          (1 << 4)
+#define IGT_SPIN_NO_PREEMPTION (1 << 5)
 
 igt_spin_t *
 __igt_spin_factory(int fd, const struct igt_spin_factory *opts);
diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index 806eb02d0..08c664776 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -472,6 +472,9 @@ gem_userptr_blits_SOURCES = i915/gem_userptr_blits.c
 TESTS_progs += gem_wait
 gem_wait_SOURCES = i915/gem_wait.c
 
+TESTS_progs += gem_vm_wait
+gem_vm_wait_SOURCES = i915/gem_vm_wait.c
+
 TESTS_progs += gem_workarounds
 gem_workarounds_SOURCES = i915/gem_workarounds.c
 
diff --git a/tests/i915/gem_vm_wait.c b/tests/i915/gem_vm_wait.c
new file mode 100644
index 000000000..63107bdd1
--- /dev/null
+++ b/tests/i915/gem_vm_wait.c
@@ -0,0 +1,523 @@
+/*
+ * Copyright © 2020 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include "igt.h"
+#include "i915/gem_vm.h"
+
+static int __gem_vm_wait(int i915, struct drm_i915_gem_vm_wait *w)
+{
+	int err;
+
+	err = 0;
+	if (igt_ioctl(i915, DRM_IOCTL_I915_GEM_VM_WAIT, w)) {
+		err = -errno;
+		igt_assume(err);
+	}
+
+	return err;
+}
+
+static uint32_t get_vm(int i915, uint32_t ctx)
+{
+	struct drm_i915_gem_context_param arg = {
+		.ctx_id = ctx,
+		.param = I915_CONTEXT_PARAM_VM,
+	};
+
+	gem_context_get_param(i915, &arg);
+	return arg.value;
+}
+
+static uint32_t __batch_create(int i915, uint32_t offset)
+{
+	const uint32_t bbe = MI_BATCH_BUFFER_END;
+	uint32_t handle;
+
+	handle = gem_create(i915, offset + 4);
+	gem_write(i915, handle, offset, &bbe, sizeof(bbe));
+
+	return handle;
+}
+
+static uint32_t batch_create(int i915)
+{
+	return __batch_create(i915, 0);
+}
+
+static struct drm_i915_gem_exec_object2
+vm_bind(int i915, uint32_t ctx, uint32_t handle, uint64_t offset)
+{
+	struct drm_i915_gem_exec_object2 obj[2] = {
+		{
+			.handle = handle,
+			.offset = offset,
+			.flags = EXEC_OBJECT_PINNED,
+		},
+		{ .handle = batch_create(i915), }
+	};
+	struct drm_i915_gem_execbuffer2 eb = {
+		.buffers_ptr = to_user_pointer(obj),
+		.buffer_count = 2,
+		.rsvd1 = ctx,
+	};
+
+	gem_execbuf(i915, &eb);
+	gem_close(i915, obj[1].handle);
+
+	igt_assert_eq_u64(obj[0].offset, offset);
+	return obj[0];
+}
+
+static void invalid_mask(int i915)
+{
+	struct drm_i915_gem_vm_wait wait;
+	uint32_t handle = gem_create(i915, 4096);
+
+	vm_bind(i915, 0, handle, 0);
+
+	memset(&wait, 0, sizeof(wait));
+	wait.vm_id = get_vm(i915, 0);
+	wait.op = I915_VM_WAIT_EQ;
+	wait.mask = I915_VM_WAIT_U32;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	/* Having proved we have an otherwise valid arg.. */
+	wait.mask = 0;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -EINVAL);
+
+	gem_vm_destroy(i915, wait.vm_id);
+	gem_close(i915, handle);
+}
+
+static void invalid_flags(int i915)
+{
+	struct drm_i915_gem_vm_wait wait;
+	uint32_t handle = gem_create(i915, 4096);
+
+	vm_bind(i915, 0, handle, 0);
+
+	memset(&wait, 0, sizeof(wait));
+	wait.vm_id = get_vm(i915, 0);
+	wait.op = I915_VM_WAIT_EQ;
+	wait.mask = I915_VM_WAIT_U32;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	/* Having proved we have an otherwise valid arg.. */
+	wait.flags = 0xffff;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -EINVAL);
+
+	gem_vm_destroy(i915, wait.vm_id);
+	gem_close(i915, handle);
+}
+
+static void invalid_iova(int i915)
+{
+	struct drm_i915_gem_vm_wait wait;
+	uint32_t handle = gem_create(i915, 4096);
+
+	vm_bind(i915, 0, handle, 0);
+
+	memset(&wait, 0, sizeof(wait));
+	wait.vm_id = get_vm(i915, 0);
+	wait.op = I915_VM_WAIT_EQ;
+	wait.mask = I915_VM_WAIT_U32;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	/* Natural alignments */
+	wait.mask = I915_VM_WAIT_U8;
+	wait.iova = 0x1;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	wait.mask = I915_VM_WAIT_U16;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -EINVAL);
+	wait.iova = 0x2;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	wait.mask = I915_VM_WAIT_U32;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -EINVAL);
+	wait.iova = 0x4;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	wait.mask = I915_VM_WAIT_U64;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -EINVAL);
+
+	gem_vm_destroy(i915, wait.vm_id);
+	gem_close(i915, handle);
+}
+
+static const char *op_repr(int op)
+{
+	switch (op) {
+#define CASE(x) case I915_VM_WAIT_##x: return #x
+		CASE(EQ);
+		CASE(NEQ);
+		CASE(GT);
+		CASE(GTE);
+		CASE(LT);
+		CASE(LTE);
+		CASE(BEFORE);
+		CASE(AFTER);
+		CASE(PASSED);
+	default: return "unknown";
+	}
+}
+
+static void basic(int i915)
+{
+	static const struct {
+		unsigned int op;
+		uint32_t a, b;
+		int result;
+#define GOOD 0
+#define BAD -ETIME
+	} ops[] = {
+		{ I915_VM_WAIT_EQ, 0, 0, GOOD },
+		{ I915_VM_WAIT_EQ, 0, 1, BAD },
+		{ I915_VM_WAIT_EQ, 1, 0, BAD },
+		{ I915_VM_WAIT_EQ, 1, 1, GOOD },
+		{ I915_VM_WAIT_EQ, 0, -1, BAD },
+		{ I915_VM_WAIT_EQ, -1, 0, BAD },
+		{ I915_VM_WAIT_EQ, -1, -1, GOOD },
+
+		{ I915_VM_WAIT_NEQ, 0, 0, BAD },
+		{ I915_VM_WAIT_NEQ, 0, 1, GOOD },
+		{ I915_VM_WAIT_NEQ, 1, 0, GOOD },
+		{ I915_VM_WAIT_NEQ, 1, 1, BAD },
+		{ I915_VM_WAIT_NEQ, 0, -1, GOOD },
+		{ I915_VM_WAIT_NEQ, -1, 0, GOOD },
+		{ I915_VM_WAIT_NEQ, -1, -1, BAD },
+
+		{ I915_VM_WAIT_GT, 0, 0, BAD },
+		{ I915_VM_WAIT_GT, 1, 0, GOOD },
+		{ I915_VM_WAIT_GT, 1, 1, BAD },
+		{ I915_VM_WAIT_GT, 0, 1, BAD },
+		{ I915_VM_WAIT_GT, -1, 0, GOOD },
+		{ I915_VM_WAIT_GT, 0, -1, BAD },
+
+		{ I915_VM_WAIT_GTE, 0, 0, GOOD },
+		{ I915_VM_WAIT_GTE, 1, 0, GOOD },
+		{ I915_VM_WAIT_GTE, 1, 1, GOOD },
+		{ I915_VM_WAIT_GTE, 0, 1, BAD },
+		{ I915_VM_WAIT_GTE, -1, 0, GOOD },
+		{ I915_VM_WAIT_GTE, 0, -1, BAD },
+
+		{ I915_VM_WAIT_LT, 0, 0, BAD },
+		{ I915_VM_WAIT_LT, 1, 0, BAD },
+		{ I915_VM_WAIT_LT, 1, 1, BAD },
+		{ I915_VM_WAIT_LT, 0, 1, GOOD },
+		{ I915_VM_WAIT_LT, -1, 0, BAD },
+		{ I915_VM_WAIT_LT, 0, -1, GOOD },
+
+		{ I915_VM_WAIT_LTE, 0, 0, GOOD },
+		{ I915_VM_WAIT_LTE, 1, 0, BAD },
+		{ I915_VM_WAIT_LTE, 1, 1, GOOD },
+		{ I915_VM_WAIT_LTE, 0, 1, GOOD },
+		{ I915_VM_WAIT_LTE, -1, 0, BAD },
+		{ I915_VM_WAIT_LTE, 0, -1, GOOD },
+
+		{ I915_VM_WAIT_BEFORE, 0, 0, BAD },
+		{ I915_VM_WAIT_BEFORE, 1, 0, BAD },
+		{ I915_VM_WAIT_BEFORE, 1, 1, BAD },
+		{ I915_VM_WAIT_BEFORE, 0, 1, GOOD },
+		{ I915_VM_WAIT_BEFORE, -1, 0, GOOD },
+		{ I915_VM_WAIT_BEFORE, 0, -1, BAD },
+
+		{ I915_VM_WAIT_AFTER, 0, 0, BAD },
+		{ I915_VM_WAIT_AFTER, 1, 0, GOOD },
+		{ I915_VM_WAIT_AFTER, 1, 1, BAD },
+		{ I915_VM_WAIT_AFTER, 0, 1, BAD },
+		{ I915_VM_WAIT_AFTER, -1, 0, BAD },
+		{ I915_VM_WAIT_AFTER, 0, -1, GOOD },
+
+		{ I915_VM_WAIT_PASSED, 0, 0, GOOD },
+		{ I915_VM_WAIT_PASSED, 1, 0, GOOD },
+		{ I915_VM_WAIT_PASSED, 1, 1, GOOD },
+		{ I915_VM_WAIT_PASSED, 0, 1, BAD },
+		{ I915_VM_WAIT_PASSED, -1, 0, BAD },
+		{ I915_VM_WAIT_PASSED, 0, -1, GOOD },
+		{ I915_VM_WAIT_PASSED, -1, -1, GOOD },
+	};
+	struct drm_i915_gem_vm_wait wait;
+	uint32_t handle = gem_create(i915, 4096);
+	uint32_t *x = gem_mmap__wc(i915, handle, 0, 4096, PROT_WRITE);
+
+	vm_bind(i915, 0, handle, 0);
+
+	memset(&wait, 0, sizeof(wait));
+	wait.vm_id = get_vm(i915, 0);
+	wait.op = I915_VM_WAIT_EQ;
+	wait.mask = I915_VM_WAIT_U32;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+	wait.op = I915_VM_WAIT_NEQ;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -ETIME);
+
+	for (int i = 0; i < ARRAY_SIZE(ops); i++) {
+		*x = ops[i].a;
+		wait.value = ops[i].b;
+		wait.op = ops[i].op;
+		igt_assert_f(__gem_vm_wait(i915, &wait) == ops[i].result,
+			     "*iova: %08x wait: { op:%s, value:%08x, }, result: %d, expected: %d\n",
+			     ops[i].a, op_repr(ops[i].op), ops[i].b,
+			     __gem_vm_wait(i915, &wait),
+			     ops[i].result);
+	}
+
+	gem_vm_destroy(i915, wait.vm_id);
+	munmap(x, 4096);
+	gem_close(i915, handle);
+}
+
+static void store_dword(int i915,
+			const struct intel_execution_engine2 *e,
+			const struct drm_i915_gem_exec_object2 *target,
+			int offset, uint32_t value)
+{
+	const int gen = intel_gen(intel_get_drm_devid(i915));
+	struct drm_i915_gem_exec_object2 obj[2];
+	struct drm_i915_gem_execbuffer2 execbuf;
+	uint32_t batch[16];
+	int i;
+
+	memset(&execbuf, 0, sizeof(execbuf));
+	execbuf.buffers_ptr = to_user_pointer(obj);
+	execbuf.buffer_count = 2;
+	execbuf.flags = e->flags;
+	if (gen > 3 && gen < 6)
+		execbuf.flags |= I915_EXEC_SECURE;
+
+	memset(obj, 0, sizeof(obj));
+	memcpy(obj, target, sizeof(*target));
+	obj[1].handle = gem_create(i915, 4096);
+
+	i = 0;
+	batch[i] = MI_STORE_DWORD_IMM | (gen < 6 ? 1 << 22 : 0);
+	if (gen >= 8) {
+		batch[++i] = target->offset + offset;
+		batch[++i] = (target->offset + offset) >> 32;
+	} else if (gen >= 4) {
+		batch[++i] = 0;
+		batch[++i] = target->offset + offset;
+	} else {
+		batch[i]--;
+		batch[++i] = target->offset + offset;
+	}
+	batch[++i] = value;
+	batch[++i] = MI_BATCH_BUFFER_END;
+	gem_write(i915, obj[1].handle, 0, batch, sizeof(batch));
+
+	gem_execbuf(i915, &execbuf);
+	gem_close(i915, obj[1].handle);
+}
+
+static void signal(int i915, const struct intel_execution_engine2 *e)
+{
+	struct drm_i915_gem_vm_wait wait;
+	struct drm_i915_gem_exec_object2 obj =
+		vm_bind(i915, 0, gem_create(i915, 4096), 0);
+
+	memset(&wait, 0, sizeof(wait));
+	wait.vm_id = get_vm(i915, 0);
+	wait.iova = obj.offset;
+	wait.op = I915_VM_WAIT_EQ;
+	wait.mask = I915_VM_WAIT_U32;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	wait.op = I915_VM_WAIT_NEQ;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -ETIME);
+
+	store_dword(i915, e, &obj, 0, 1);
+	gem_sync(i915, obj.handle);
+
+	wait.op = I915_VM_WAIT_NEQ;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	wait.op = I915_VM_WAIT_EQ;
+	wait.value = 1;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	wait.op = I915_VM_WAIT_NEQ;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -ETIME);
+
+	igt_fork(child, 1) {
+		usleep(50000);
+		store_dword(i915, e, &obj, 0, 2);
+	}
+
+	wait.timeout = NSEC_PER_SEC;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+	igt_waitchildren();
+
+	gem_vm_destroy(i915, wait.vm_id);
+	gem_close(i915, obj.handle);
+}
+
+static void spin(int i915, const struct intel_execution_engine2 *e)
+{
+	struct drm_i915_gem_vm_wait wait;
+	igt_spin_t *spin;
+
+	spin = igt_spin_new(i915,
+			    .engine = e->flags,
+			    .flags = IGT_SPIN_POLL_RUN | IGT_SPIN_WAKE_RUN);
+	igt_spin_busywait_until_started(spin);
+
+	memset(&wait, 0, sizeof(wait));
+	wait.vm_id = get_vm(i915, 0);;
+	wait.iova = spin->obj[0].offset;
+	wait.op = I915_VM_WAIT_NEQ;
+	wait.mask = I915_VM_WAIT_U32;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	igt_spin_end(spin);
+	igt_spin_reset(spin);
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -ETIME);
+
+	igt_fork(child, 1) {
+		usleep(50000);
+		gem_execbuf(i915, &spin->execbuf);
+	}
+
+	wait.timeout = NSEC_PER_SEC;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	igt_waitchildren();
+	igt_spin_free(i915, spin);
+
+	gem_vm_destroy(i915, wait.vm_id);
+}
+
+static void hang(int i915, const struct intel_execution_engine2 *e)
+{
+	struct drm_i915_gem_vm_wait wait;
+	igt_spin_t *spin;
+
+	spin = igt_spin_new(i915,
+			    .engine = e->flags,
+			    .flags = (IGT_SPIN_POLL_RUN |
+				      IGT_SPIN_NO_PREEMPTION));
+	igt_spin_busywait_until_started(spin);
+
+	memset(&wait, 0, sizeof(wait));
+	wait.vm_id = get_vm(i915, 0);;
+	wait.iova = spin->obj[0].offset;
+	wait.op = I915_VM_WAIT_NEQ;
+	wait.mask = I915_VM_WAIT_U32;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	igt_spin_end(spin);
+	igt_spin_reset(spin);
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -ETIME);
+
+	igt_fork(child, 1) {
+		usleep(50000);
+		gem_execbuf(i915, &spin->execbuf);
+	}
+
+	wait.timeout = -1;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	igt_waitchildren();
+	igt_spin_free(i915, spin);
+
+	gem_vm_destroy(i915, wait.vm_id);
+}
+
+static bool has_vm_wait(int i915)
+{
+	struct drm_i915_gem_vm_wait wait = { .mask = -1ull };
+
+	return __gem_vm_wait(i915, &wait) == -ENOENT;
+}
+
+static bool has_vm(int i915)
+{
+	struct drm_i915_gem_context_param arg = {
+		.param = I915_CONTEXT_PARAM_VM,
+	};
+
+	if (__gem_context_get_param(i915, &arg))
+		return false;
+
+	gem_vm_destroy(i915, arg.value);
+	return true;
+}
+
+igt_main
+{
+	const struct intel_execution_engine2 *e;
+	int i915 = -1;
+
+	igt_fixture {
+		i915 = drm_open_driver_master(DRIVER_INTEL);
+		igt_require(has_vm(i915));
+		igt_require(has_vm_wait(i915));
+		igt_require_gem(i915);
+	}
+
+	igt_subtest("invalid-mask")
+		invalid_mask(i915);
+
+	igt_subtest("invalid-flags")
+		invalid_flags(i915);
+
+	igt_subtest("invalid-iova")
+		invalid_iova(i915);
+
+	igt_subtest("basic")
+		basic(i915);
+
+	igt_subtest_with_dynamic("signal") {
+		__for_each_physical_engine(i915, e) {
+			igt_dynamic_f("%s", e->name)
+				signal(i915, e);
+		}
+	}
+
+	igt_subtest_with_dynamic("spin") {
+		__for_each_physical_engine(i915, e) {
+			igt_dynamic_f("%s", e->name)
+				spin(i915, e);
+		}
+	}
+
+	igt_subtest_group {
+		igt_hang_t hh;
+
+		igt_fixture
+			hh = igt_allow_hang(i915, 0, 0);
+
+		igt_subtest_with_dynamic("hang") {
+			__for_each_physical_engine(i915, e) {
+				igt_dynamic_f("%s", e->name)
+					hang(i915, e);
+			}
+		}
+
+		igt_fixture
+			igt_disallow_hang(i915, hh);
+	}
+
+	igt_fixture {
+		close(i915);
+	}
+}
diff --git a/tests/meson.build b/tests/meson.build
index a79d22ba1..154b7ad16 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -223,6 +223,7 @@ i915_progs = [
 	'gem_unref_active_buffers',
 	'gem_userptr_blits',
 	'gem_vm_create',
+	'gem_vm_wait',
 	'gem_wait',
 	'gem_workarounds',
 	'gem_write_read_ring_switch',
-- 
2.25.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* [igt-dev] [PATCH i-g-t] i915: Exercise VM_WAIT ioctl
@ 2020-01-18 22:16 ` Chris Wilson
  0 siblings, 0 replies; 4+ messages in thread
From: Chris Wilson @ 2020-01-18 22:16 UTC (permalink / raw)
  To: intel-gfx; +Cc: igt-dev

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
---
 include/drm-uapi/i915_drm.h |  37 +++
 lib/igt_dummyload.c         |   2 +
 lib/igt_dummyload.h         |   5 +-
 tests/Makefile.sources      |   3 +
 tests/i915/gem_vm_wait.c    | 523 ++++++++++++++++++++++++++++++++++++
 tests/meson.build           |   1 +
 6 files changed, 569 insertions(+), 2 deletions(-)
 create mode 100644 tests/i915/gem_vm_wait.c

diff --git a/include/drm-uapi/i915_drm.h b/include/drm-uapi/i915_drm.h
index b94e991be..62e5ccd2c 100644
--- a/include/drm-uapi/i915_drm.h
+++ b/include/drm-uapi/i915_drm.h
@@ -359,6 +359,7 @@ typedef struct _drm_i915_sarea {
 #define DRM_I915_QUERY			0x39
 #define DRM_I915_GEM_VM_CREATE		0x3a
 #define DRM_I915_GEM_VM_DESTROY		0x3b
+#define DRM_I915_GEM_VM_WAIT		0x3c
 /* Must be kept compact -- no holes */
 
 #define DRM_IOCTL_I915_INIT		DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t)
@@ -422,6 +423,7 @@ typedef struct _drm_i915_sarea {
 #define DRM_IOCTL_I915_QUERY			DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_QUERY, struct drm_i915_query)
 #define DRM_IOCTL_I915_GEM_VM_CREATE	DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_VM_CREATE, struct drm_i915_gem_vm_control)
 #define DRM_IOCTL_I915_GEM_VM_DESTROY	DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_VM_DESTROY, struct drm_i915_gem_vm_control)
+#define DRM_IOCTL_I915_GEM_VM_WAIT	DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_VM_WAIT, struct drm_i915_gem_vm_wait)
 
 /* Allow drivers to submit batchbuffers directly to hardware, relying
  * on the security mechanisms provided by hardware.
@@ -1824,6 +1826,41 @@ struct drm_i915_gem_vm_control {
 	__u32 vm_id;
 };
 
+/*
+ * (*IOVA & MASK) OP (VALUE & MASK)
+ *
+ * OP:
+ * - EQ, NEQ
+ * - GT, GTE
+ * - LT, LTE
+ * - BEFORE, AFTER
+ *
+ */
+struct drm_i915_gem_vm_wait {
+	__u64 extensions;
+	__u64 iova;
+	__u32 vm_id;
+	__u16 op;
+#define I915_VM_WAIT_EQ		0
+#define I915_VM_WAIT_NEQ	1
+#define I915_VM_WAIT_GT		2
+#define I915_VM_WAIT_GTE	3
+#define I915_VM_WAIT_LT		4
+#define I915_VM_WAIT_LTE	5
+#define I915_VM_WAIT_BEFORE	6
+#define I915_VM_WAIT_AFTER	7
+#define I915_VM_WAIT_PASSED	8
+	__u16 flags;
+#define I915_VM_WAIT_ABSTIME 0x1
+	__u64 value;
+	__u64 mask;
+#define I915_VM_WAIT_U8		0xffu
+#define I915_VM_WAIT_U16	0xffffu
+#define I915_VM_WAIT_U32	0xfffffffful
+#define I915_VM_WAIT_U64	0xffffffffffffffffull
+	__u64 timeout;
+};
+
 struct drm_i915_reg_read {
 	/*
 	 * Register offset.
diff --git a/lib/igt_dummyload.c b/lib/igt_dummyload.c
index b7f4caca3..7bc37889b 100644
--- a/lib/igt_dummyload.c
+++ b/lib/igt_dummyload.c
@@ -176,6 +176,8 @@ emit_recursive_batch(igt_spin_t *spin,
 		}
 
 		*cs++ = 1;
+		if (opts->flags & IGT_SPIN_WAKE_RUN)
+			*cs++ = 0x2 << 23;
 
 		execbuf->buffer_count++;
 	}
diff --git a/lib/igt_dummyload.h b/lib/igt_dummyload.h
index 421ca183b..8264834ce 100644
--- a/lib/igt_dummyload.h
+++ b/lib/igt_dummyload.h
@@ -60,8 +60,9 @@ struct igt_spin_factory {
 #define IGT_SPIN_FENCE_IN      (1 << 0)
 #define IGT_SPIN_FENCE_OUT     (1 << 1)
 #define IGT_SPIN_POLL_RUN      (1 << 2)
-#define IGT_SPIN_FAST          (1 << 3)
-#define IGT_SPIN_NO_PREEMPTION (1 << 4)
+#define IGT_SPIN_WAKE_RUN      (1 << 3)
+#define IGT_SPIN_FAST          (1 << 4)
+#define IGT_SPIN_NO_PREEMPTION (1 << 5)
 
 igt_spin_t *
 __igt_spin_factory(int fd, const struct igt_spin_factory *opts);
diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index 806eb02d0..08c664776 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -472,6 +472,9 @@ gem_userptr_blits_SOURCES = i915/gem_userptr_blits.c
 TESTS_progs += gem_wait
 gem_wait_SOURCES = i915/gem_wait.c
 
+TESTS_progs += gem_vm_wait
+gem_vm_wait_SOURCES = i915/gem_vm_wait.c
+
 TESTS_progs += gem_workarounds
 gem_workarounds_SOURCES = i915/gem_workarounds.c
 
diff --git a/tests/i915/gem_vm_wait.c b/tests/i915/gem_vm_wait.c
new file mode 100644
index 000000000..63107bdd1
--- /dev/null
+++ b/tests/i915/gem_vm_wait.c
@@ -0,0 +1,523 @@
+/*
+ * Copyright © 2020 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include "igt.h"
+#include "i915/gem_vm.h"
+
+static int __gem_vm_wait(int i915, struct drm_i915_gem_vm_wait *w)
+{
+	int err;
+
+	err = 0;
+	if (igt_ioctl(i915, DRM_IOCTL_I915_GEM_VM_WAIT, w)) {
+		err = -errno;
+		igt_assume(err);
+	}
+
+	return err;
+}
+
+static uint32_t get_vm(int i915, uint32_t ctx)
+{
+	struct drm_i915_gem_context_param arg = {
+		.ctx_id = ctx,
+		.param = I915_CONTEXT_PARAM_VM,
+	};
+
+	gem_context_get_param(i915, &arg);
+	return arg.value;
+}
+
+static uint32_t __batch_create(int i915, uint32_t offset)
+{
+	const uint32_t bbe = MI_BATCH_BUFFER_END;
+	uint32_t handle;
+
+	handle = gem_create(i915, offset + 4);
+	gem_write(i915, handle, offset, &bbe, sizeof(bbe));
+
+	return handle;
+}
+
+static uint32_t batch_create(int i915)
+{
+	return __batch_create(i915, 0);
+}
+
+static struct drm_i915_gem_exec_object2
+vm_bind(int i915, uint32_t ctx, uint32_t handle, uint64_t offset)
+{
+	struct drm_i915_gem_exec_object2 obj[2] = {
+		{
+			.handle = handle,
+			.offset = offset,
+			.flags = EXEC_OBJECT_PINNED,
+		},
+		{ .handle = batch_create(i915), }
+	};
+	struct drm_i915_gem_execbuffer2 eb = {
+		.buffers_ptr = to_user_pointer(obj),
+		.buffer_count = 2,
+		.rsvd1 = ctx,
+	};
+
+	gem_execbuf(i915, &eb);
+	gem_close(i915, obj[1].handle);
+
+	igt_assert_eq_u64(obj[0].offset, offset);
+	return obj[0];
+}
+
+static void invalid_mask(int i915)
+{
+	struct drm_i915_gem_vm_wait wait;
+	uint32_t handle = gem_create(i915, 4096);
+
+	vm_bind(i915, 0, handle, 0);
+
+	memset(&wait, 0, sizeof(wait));
+	wait.vm_id = get_vm(i915, 0);
+	wait.op = I915_VM_WAIT_EQ;
+	wait.mask = I915_VM_WAIT_U32;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	/* Having proved we have an otherwise valid arg.. */
+	wait.mask = 0;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -EINVAL);
+
+	gem_vm_destroy(i915, wait.vm_id);
+	gem_close(i915, handle);
+}
+
+static void invalid_flags(int i915)
+{
+	struct drm_i915_gem_vm_wait wait;
+	uint32_t handle = gem_create(i915, 4096);
+
+	vm_bind(i915, 0, handle, 0);
+
+	memset(&wait, 0, sizeof(wait));
+	wait.vm_id = get_vm(i915, 0);
+	wait.op = I915_VM_WAIT_EQ;
+	wait.mask = I915_VM_WAIT_U32;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	/* Having proved we have an otherwise valid arg.. */
+	wait.flags = 0xffff;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -EINVAL);
+
+	gem_vm_destroy(i915, wait.vm_id);
+	gem_close(i915, handle);
+}
+
+static void invalid_iova(int i915)
+{
+	struct drm_i915_gem_vm_wait wait;
+	uint32_t handle = gem_create(i915, 4096);
+
+	vm_bind(i915, 0, handle, 0);
+
+	memset(&wait, 0, sizeof(wait));
+	wait.vm_id = get_vm(i915, 0);
+	wait.op = I915_VM_WAIT_EQ;
+	wait.mask = I915_VM_WAIT_U32;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	/* Natural alignments */
+	wait.mask = I915_VM_WAIT_U8;
+	wait.iova = 0x1;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	wait.mask = I915_VM_WAIT_U16;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -EINVAL);
+	wait.iova = 0x2;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	wait.mask = I915_VM_WAIT_U32;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -EINVAL);
+	wait.iova = 0x4;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	wait.mask = I915_VM_WAIT_U64;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -EINVAL);
+
+	gem_vm_destroy(i915, wait.vm_id);
+	gem_close(i915, handle);
+}
+
+static const char *op_repr(int op)
+{
+	switch (op) {
+#define CASE(x) case I915_VM_WAIT_##x: return #x
+		CASE(EQ);
+		CASE(NEQ);
+		CASE(GT);
+		CASE(GTE);
+		CASE(LT);
+		CASE(LTE);
+		CASE(BEFORE);
+		CASE(AFTER);
+		CASE(PASSED);
+	default: return "unknown";
+	}
+}
+
+static void basic(int i915)
+{
+	static const struct {
+		unsigned int op;
+		uint32_t a, b;
+		int result;
+#define GOOD 0
+#define BAD -ETIME
+	} ops[] = {
+		{ I915_VM_WAIT_EQ, 0, 0, GOOD },
+		{ I915_VM_WAIT_EQ, 0, 1, BAD },
+		{ I915_VM_WAIT_EQ, 1, 0, BAD },
+		{ I915_VM_WAIT_EQ, 1, 1, GOOD },
+		{ I915_VM_WAIT_EQ, 0, -1, BAD },
+		{ I915_VM_WAIT_EQ, -1, 0, BAD },
+		{ I915_VM_WAIT_EQ, -1, -1, GOOD },
+
+		{ I915_VM_WAIT_NEQ, 0, 0, BAD },
+		{ I915_VM_WAIT_NEQ, 0, 1, GOOD },
+		{ I915_VM_WAIT_NEQ, 1, 0, GOOD },
+		{ I915_VM_WAIT_NEQ, 1, 1, BAD },
+		{ I915_VM_WAIT_NEQ, 0, -1, GOOD },
+		{ I915_VM_WAIT_NEQ, -1, 0, GOOD },
+		{ I915_VM_WAIT_NEQ, -1, -1, BAD },
+
+		{ I915_VM_WAIT_GT, 0, 0, BAD },
+		{ I915_VM_WAIT_GT, 1, 0, GOOD },
+		{ I915_VM_WAIT_GT, 1, 1, BAD },
+		{ I915_VM_WAIT_GT, 0, 1, BAD },
+		{ I915_VM_WAIT_GT, -1, 0, GOOD },
+		{ I915_VM_WAIT_GT, 0, -1, BAD },
+
+		{ I915_VM_WAIT_GTE, 0, 0, GOOD },
+		{ I915_VM_WAIT_GTE, 1, 0, GOOD },
+		{ I915_VM_WAIT_GTE, 1, 1, GOOD },
+		{ I915_VM_WAIT_GTE, 0, 1, BAD },
+		{ I915_VM_WAIT_GTE, -1, 0, GOOD },
+		{ I915_VM_WAIT_GTE, 0, -1, BAD },
+
+		{ I915_VM_WAIT_LT, 0, 0, BAD },
+		{ I915_VM_WAIT_LT, 1, 0, BAD },
+		{ I915_VM_WAIT_LT, 1, 1, BAD },
+		{ I915_VM_WAIT_LT, 0, 1, GOOD },
+		{ I915_VM_WAIT_LT, -1, 0, BAD },
+		{ I915_VM_WAIT_LT, 0, -1, GOOD },
+
+		{ I915_VM_WAIT_LTE, 0, 0, GOOD },
+		{ I915_VM_WAIT_LTE, 1, 0, BAD },
+		{ I915_VM_WAIT_LTE, 1, 1, GOOD },
+		{ I915_VM_WAIT_LTE, 0, 1, GOOD },
+		{ I915_VM_WAIT_LTE, -1, 0, BAD },
+		{ I915_VM_WAIT_LTE, 0, -1, GOOD },
+
+		{ I915_VM_WAIT_BEFORE, 0, 0, BAD },
+		{ I915_VM_WAIT_BEFORE, 1, 0, BAD },
+		{ I915_VM_WAIT_BEFORE, 1, 1, BAD },
+		{ I915_VM_WAIT_BEFORE, 0, 1, GOOD },
+		{ I915_VM_WAIT_BEFORE, -1, 0, GOOD },
+		{ I915_VM_WAIT_BEFORE, 0, -1, BAD },
+
+		{ I915_VM_WAIT_AFTER, 0, 0, BAD },
+		{ I915_VM_WAIT_AFTER, 1, 0, GOOD },
+		{ I915_VM_WAIT_AFTER, 1, 1, BAD },
+		{ I915_VM_WAIT_AFTER, 0, 1, BAD },
+		{ I915_VM_WAIT_AFTER, -1, 0, BAD },
+		{ I915_VM_WAIT_AFTER, 0, -1, GOOD },
+
+		{ I915_VM_WAIT_PASSED, 0, 0, GOOD },
+		{ I915_VM_WAIT_PASSED, 1, 0, GOOD },
+		{ I915_VM_WAIT_PASSED, 1, 1, GOOD },
+		{ I915_VM_WAIT_PASSED, 0, 1, BAD },
+		{ I915_VM_WAIT_PASSED, -1, 0, BAD },
+		{ I915_VM_WAIT_PASSED, 0, -1, GOOD },
+		{ I915_VM_WAIT_PASSED, -1, -1, GOOD },
+	};
+	struct drm_i915_gem_vm_wait wait;
+	uint32_t handle = gem_create(i915, 4096);
+	uint32_t *x = gem_mmap__wc(i915, handle, 0, 4096, PROT_WRITE);
+
+	vm_bind(i915, 0, handle, 0);
+
+	memset(&wait, 0, sizeof(wait));
+	wait.vm_id = get_vm(i915, 0);
+	wait.op = I915_VM_WAIT_EQ;
+	wait.mask = I915_VM_WAIT_U32;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+	wait.op = I915_VM_WAIT_NEQ;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -ETIME);
+
+	for (int i = 0; i < ARRAY_SIZE(ops); i++) {
+		*x = ops[i].a;
+		wait.value = ops[i].b;
+		wait.op = ops[i].op;
+		igt_assert_f(__gem_vm_wait(i915, &wait) == ops[i].result,
+			     "*iova: %08x wait: { op:%s, value:%08x, }, result: %d, expected: %d\n",
+			     ops[i].a, op_repr(ops[i].op), ops[i].b,
+			     __gem_vm_wait(i915, &wait),
+			     ops[i].result);
+	}
+
+	gem_vm_destroy(i915, wait.vm_id);
+	munmap(x, 4096);
+	gem_close(i915, handle);
+}
+
+static void store_dword(int i915,
+			const struct intel_execution_engine2 *e,
+			const struct drm_i915_gem_exec_object2 *target,
+			int offset, uint32_t value)
+{
+	const int gen = intel_gen(intel_get_drm_devid(i915));
+	struct drm_i915_gem_exec_object2 obj[2];
+	struct drm_i915_gem_execbuffer2 execbuf;
+	uint32_t batch[16];
+	int i;
+
+	memset(&execbuf, 0, sizeof(execbuf));
+	execbuf.buffers_ptr = to_user_pointer(obj);
+	execbuf.buffer_count = 2;
+	execbuf.flags = e->flags;
+	if (gen > 3 && gen < 6)
+		execbuf.flags |= I915_EXEC_SECURE;
+
+	memset(obj, 0, sizeof(obj));
+	memcpy(obj, target, sizeof(*target));
+	obj[1].handle = gem_create(i915, 4096);
+
+	i = 0;
+	batch[i] = MI_STORE_DWORD_IMM | (gen < 6 ? 1 << 22 : 0);
+	if (gen >= 8) {
+		batch[++i] = target->offset + offset;
+		batch[++i] = (target->offset + offset) >> 32;
+	} else if (gen >= 4) {
+		batch[++i] = 0;
+		batch[++i] = target->offset + offset;
+	} else {
+		batch[i]--;
+		batch[++i] = target->offset + offset;
+	}
+	batch[++i] = value;
+	batch[++i] = MI_BATCH_BUFFER_END;
+	gem_write(i915, obj[1].handle, 0, batch, sizeof(batch));
+
+	gem_execbuf(i915, &execbuf);
+	gem_close(i915, obj[1].handle);
+}
+
+static void signal(int i915, const struct intel_execution_engine2 *e)
+{
+	struct drm_i915_gem_vm_wait wait;
+	struct drm_i915_gem_exec_object2 obj =
+		vm_bind(i915, 0, gem_create(i915, 4096), 0);
+
+	memset(&wait, 0, sizeof(wait));
+	wait.vm_id = get_vm(i915, 0);
+	wait.iova = obj.offset;
+	wait.op = I915_VM_WAIT_EQ;
+	wait.mask = I915_VM_WAIT_U32;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	wait.op = I915_VM_WAIT_NEQ;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -ETIME);
+
+	store_dword(i915, e, &obj, 0, 1);
+	gem_sync(i915, obj.handle);
+
+	wait.op = I915_VM_WAIT_NEQ;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	wait.op = I915_VM_WAIT_EQ;
+	wait.value = 1;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	wait.op = I915_VM_WAIT_NEQ;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -ETIME);
+
+	igt_fork(child, 1) {
+		usleep(50000);
+		store_dword(i915, e, &obj, 0, 2);
+	}
+
+	wait.timeout = NSEC_PER_SEC;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+	igt_waitchildren();
+
+	gem_vm_destroy(i915, wait.vm_id);
+	gem_close(i915, obj.handle);
+}
+
+static void spin(int i915, const struct intel_execution_engine2 *e)
+{
+	struct drm_i915_gem_vm_wait wait;
+	igt_spin_t *spin;
+
+	spin = igt_spin_new(i915,
+			    .engine = e->flags,
+			    .flags = IGT_SPIN_POLL_RUN | IGT_SPIN_WAKE_RUN);
+	igt_spin_busywait_until_started(spin);
+
+	memset(&wait, 0, sizeof(wait));
+	wait.vm_id = get_vm(i915, 0);;
+	wait.iova = spin->obj[0].offset;
+	wait.op = I915_VM_WAIT_NEQ;
+	wait.mask = I915_VM_WAIT_U32;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	igt_spin_end(spin);
+	igt_spin_reset(spin);
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -ETIME);
+
+	igt_fork(child, 1) {
+		usleep(50000);
+		gem_execbuf(i915, &spin->execbuf);
+	}
+
+	wait.timeout = NSEC_PER_SEC;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	igt_waitchildren();
+	igt_spin_free(i915, spin);
+
+	gem_vm_destroy(i915, wait.vm_id);
+}
+
+static void hang(int i915, const struct intel_execution_engine2 *e)
+{
+	struct drm_i915_gem_vm_wait wait;
+	igt_spin_t *spin;
+
+	spin = igt_spin_new(i915,
+			    .engine = e->flags,
+			    .flags = (IGT_SPIN_POLL_RUN |
+				      IGT_SPIN_NO_PREEMPTION));
+	igt_spin_busywait_until_started(spin);
+
+	memset(&wait, 0, sizeof(wait));
+	wait.vm_id = get_vm(i915, 0);;
+	wait.iova = spin->obj[0].offset;
+	wait.op = I915_VM_WAIT_NEQ;
+	wait.mask = I915_VM_WAIT_U32;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	igt_spin_end(spin);
+	igt_spin_reset(spin);
+	igt_assert_eq(__gem_vm_wait(i915, &wait), -ETIME);
+
+	igt_fork(child, 1) {
+		usleep(50000);
+		gem_execbuf(i915, &spin->execbuf);
+	}
+
+	wait.timeout = -1;
+	igt_assert_eq(__gem_vm_wait(i915, &wait), 0);
+
+	igt_waitchildren();
+	igt_spin_free(i915, spin);
+
+	gem_vm_destroy(i915, wait.vm_id);
+}
+
+static bool has_vm_wait(int i915)
+{
+	struct drm_i915_gem_vm_wait wait = { .mask = -1ull };
+
+	return __gem_vm_wait(i915, &wait) == -ENOENT;
+}
+
+static bool has_vm(int i915)
+{
+	struct drm_i915_gem_context_param arg = {
+		.param = I915_CONTEXT_PARAM_VM,
+	};
+
+	if (__gem_context_get_param(i915, &arg))
+		return false;
+
+	gem_vm_destroy(i915, arg.value);
+	return true;
+}
+
+igt_main
+{
+	const struct intel_execution_engine2 *e;
+	int i915 = -1;
+
+	igt_fixture {
+		i915 = drm_open_driver_master(DRIVER_INTEL);
+		igt_require(has_vm(i915));
+		igt_require(has_vm_wait(i915));
+		igt_require_gem(i915);
+	}
+
+	igt_subtest("invalid-mask")
+		invalid_mask(i915);
+
+	igt_subtest("invalid-flags")
+		invalid_flags(i915);
+
+	igt_subtest("invalid-iova")
+		invalid_iova(i915);
+
+	igt_subtest("basic")
+		basic(i915);
+
+	igt_subtest_with_dynamic("signal") {
+		__for_each_physical_engine(i915, e) {
+			igt_dynamic_f("%s", e->name)
+				signal(i915, e);
+		}
+	}
+
+	igt_subtest_with_dynamic("spin") {
+		__for_each_physical_engine(i915, e) {
+			igt_dynamic_f("%s", e->name)
+				spin(i915, e);
+		}
+	}
+
+	igt_subtest_group {
+		igt_hang_t hh;
+
+		igt_fixture
+			hh = igt_allow_hang(i915, 0, 0);
+
+		igt_subtest_with_dynamic("hang") {
+			__for_each_physical_engine(i915, e) {
+				igt_dynamic_f("%s", e->name)
+					hang(i915, e);
+			}
+		}
+
+		igt_fixture
+			igt_disallow_hang(i915, hh);
+	}
+
+	igt_fixture {
+		close(i915);
+	}
+}
diff --git a/tests/meson.build b/tests/meson.build
index a79d22ba1..154b7ad16 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -223,6 +223,7 @@ i915_progs = [
 	'gem_unref_active_buffers',
 	'gem_userptr_blits',
 	'gem_vm_create',
+	'gem_vm_wait',
 	'gem_wait',
 	'gem_workarounds',
 	'gem_write_read_ring_switch',
-- 
2.25.0

_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] ✓ Fi.CI.BAT: success for i915: Exercise VM_WAIT ioctl
  2020-01-18 22:16 ` [igt-dev] " Chris Wilson
  (?)
@ 2020-01-18 22:44 ` Patchwork
  -1 siblings, 0 replies; 4+ messages in thread
From: Patchwork @ 2020-01-18 22:44 UTC (permalink / raw)
  To: Chris Wilson; +Cc: igt-dev

== Series Details ==

Series: i915: Exercise VM_WAIT ioctl
URL   : https://patchwork.freedesktop.org/series/72241/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_7772 -> IGTPW_3945
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

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

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

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

### IGT changes ###

#### Issues hit ####

  * igt@i915_selftest@live_blt:
    - fi-hsw-4770:        [PASS][1] -> [DMESG-FAIL][2] ([i915#553])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/fi-hsw-4770/igt@i915_selftest@live_blt.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/fi-hsw-4770/igt@i915_selftest@live_blt.html

  * igt@i915_selftest@live_gem_contexts:
    - fi-byt-j1900:       [PASS][3] -> [DMESG-FAIL][4] ([i915#722])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/fi-byt-j1900/igt@i915_selftest@live_gem_contexts.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/fi-byt-j1900/igt@i915_selftest@live_gem_contexts.html

  * igt@kms_chamelium@hdmi-hpd-fast:
    - fi-kbl-7500u:       [PASS][5] -> [FAIL][6] ([fdo#111096] / [i915#323])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/fi-kbl-7500u/igt@kms_chamelium@hdmi-hpd-fast.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/fi-kbl-7500u/igt@kms_chamelium@hdmi-hpd-fast.html

  
#### Possible fixes ####

  * igt@i915_module_load@reload-with-fault-injection:
    - fi-skl-6700k2:      [INCOMPLETE][7] ([i915#671]) -> [PASS][8]
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/fi-skl-6700k2/igt@i915_module_load@reload-with-fault-injection.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/fi-skl-6700k2/igt@i915_module_load@reload-with-fault-injection.html

  * igt@i915_pm_rpm@module-reload:
    - fi-skl-6770hq:      [FAIL][9] ([i915#178]) -> [PASS][10]
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/fi-skl-6770hq/igt@i915_pm_rpm@module-reload.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/fi-skl-6770hq/igt@i915_pm_rpm@module-reload.html

  
  [fdo#111096]: https://bugs.freedesktop.org/show_bug.cgi?id=111096
  [i915#178]: https://gitlab.freedesktop.org/drm/intel/issues/178
  [i915#323]: https://gitlab.freedesktop.org/drm/intel/issues/323
  [i915#553]: https://gitlab.freedesktop.org/drm/intel/issues/553
  [i915#671]: https://gitlab.freedesktop.org/drm/intel/issues/671
  [i915#722]: https://gitlab.freedesktop.org/drm/intel/issues/722


Participating hosts (40 -> 44)
------------------------------

  Additional (8): fi-hsw-4770r fi-bdw-5557u fi-hsw-peppy fi-snb-2520m fi-ivb-3770 fi-elk-e7500 fi-skl-lmem fi-snb-2600 
  Missing    (4): fi-byt-clapper fi-byt-squawks fi-bsw-cyan fi-bsw-n3050 


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

  * CI: CI-20190529 -> None
  * IGT: IGT_5372 -> IGTPW_3945

  CI-20190529: 20190529
  CI_DRM_7772: f65c394056d8637ff151fa83d5d1613adc0932d2 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_3945: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/index.html
  IGT_5372: 0d00a27fbbd4d4a77d24499ea9811e07e65eb0ac @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools



== Testlist changes ==

+igt@gem_vm_wait@basic
+igt@gem_vm_wait@hang
+igt@gem_vm_wait@invalid-flags
+igt@gem_vm_wait@invalid-iova
+igt@gem_vm_wait@invalid-mask
+igt@gem_vm_wait@signal
+igt@gem_vm_wait@spin

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/index.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] ✓ Fi.CI.IGT: success for i915: Exercise VM_WAIT ioctl
  2020-01-18 22:16 ` [igt-dev] " Chris Wilson
  (?)
  (?)
@ 2020-01-21  0:01 ` Patchwork
  -1 siblings, 0 replies; 4+ messages in thread
From: Patchwork @ 2020-01-21  0:01 UTC (permalink / raw)
  To: Chris Wilson; +Cc: igt-dev

== Series Details ==

Series: i915: Exercise VM_WAIT ioctl
URL   : https://patchwork.freedesktop.org/series/72241/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_7772_full -> IGTPW_3945_full
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

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

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

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

### IGT changes ###

#### Possible regressions ####

  * {igt@gem_vm_wait@spin} (NEW):
    - shard-iclb:         NOTRUN -> [SKIP][1] +6 similar issues
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb2/igt@gem_vm_wait@spin.html

  
New tests
---------

  New tests have been introduced between CI_DRM_7772_full and IGTPW_3945_full:

### New IGT tests (7) ###

  * igt@gem_vm_wait@basic:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@gem_vm_wait@hang:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@gem_vm_wait@invalid-flags:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@gem_vm_wait@invalid-iova:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@gem_vm_wait@invalid-mask:
    - Statuses : 4 skip(s)
    - Exec time: [0.0] s

  * igt@gem_vm_wait@signal:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@gem_vm_wait@spin:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  

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

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

### IGT changes ###

#### Issues hit ####

  * igt@gem_busy@busy-vcs1:
    - shard-iclb:         [PASS][2] -> [SKIP][3] ([fdo#112080]) +17 similar issues
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb2/igt@gem_busy@busy-vcs1.html
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb5/igt@gem_busy@busy-vcs1.html

  * igt@gem_ctx_isolation@rcs0-s3:
    - shard-kbl:          [PASS][4] -> [DMESG-WARN][5] ([i915#180]) +3 similar issues
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-kbl6/igt@gem_ctx_isolation@rcs0-s3.html
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-kbl2/igt@gem_ctx_isolation@rcs0-s3.html

  * igt@gem_ctx_isolation@vcs1-dirty-create:
    - shard-iclb:         [PASS][6] -> [SKIP][7] ([fdo#109276] / [fdo#112080]) +2 similar issues
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb2/igt@gem_ctx_isolation@vcs1-dirty-create.html
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb5/igt@gem_ctx_isolation@vcs1-dirty-create.html

  * igt@gem_exec_schedule@in-order-bsd:
    - shard-iclb:         [PASS][8] -> [SKIP][9] ([fdo#112146]) +2 similar issues
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb6/igt@gem_exec_schedule@in-order-bsd.html
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb2/igt@gem_exec_schedule@in-order-bsd.html

  * igt@gem_persistent_relocs@forked-interruptible-faulting-reloc-thrash-inactive:
    - shard-apl:          [PASS][10] -> [INCOMPLETE][11] ([CI#80] / [fdo#103927] / [i915#530])
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-apl2/igt@gem_persistent_relocs@forked-interruptible-faulting-reloc-thrash-inactive.html
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-apl6/igt@gem_persistent_relocs@forked-interruptible-faulting-reloc-thrash-inactive.html

  * igt@gem_persistent_relocs@forked-interruptible-thrash-inactive:
    - shard-apl:          [PASS][12] -> [TIMEOUT][13] ([fdo#112271] / [i915#530])
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-apl7/igt@gem_persistent_relocs@forked-interruptible-thrash-inactive.html
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-apl7/igt@gem_persistent_relocs@forked-interruptible-thrash-inactive.html

  * igt@gem_persistent_relocs@forked-interruptible-thrashing:
    - shard-snb:          [PASS][14] -> [FAIL][15] ([i915#520])
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-snb2/igt@gem_persistent_relocs@forked-interruptible-thrashing.html
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-snb6/igt@gem_persistent_relocs@forked-interruptible-thrashing.html
    - shard-iclb:         [PASS][16] -> [FAIL][17] ([i915#520])
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb8/igt@gem_persistent_relocs@forked-interruptible-thrashing.html
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb6/igt@gem_persistent_relocs@forked-interruptible-thrashing.html

  * igt@gem_persistent_relocs@forked-thrashing:
    - shard-kbl:          [PASS][18] -> [INCOMPLETE][19] ([fdo#103665] / [i915#530])
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-kbl7/igt@gem_persistent_relocs@forked-thrashing.html
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-kbl4/igt@gem_persistent_relocs@forked-thrashing.html

  * igt@gem_ppgtt@flink-and-close-vma-leak:
    - shard-glk:          [PASS][20] -> [FAIL][21] ([i915#644])
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-glk9/igt@gem_ppgtt@flink-and-close-vma-leak.html
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-glk5/igt@gem_ppgtt@flink-and-close-vma-leak.html

  * igt@gen9_exec_parse@allowed-all:
    - shard-glk:          [PASS][22] -> [DMESG-WARN][23] ([i915#716])
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-glk5/igt@gen9_exec_parse@allowed-all.html
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-glk3/igt@gen9_exec_parse@allowed-all.html

  * igt@i915_pm_dc@dc5-dpms:
    - shard-iclb:         [PASS][24] -> [FAIL][25] ([i915#447])
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb5/igt@i915_pm_dc@dc5-dpms.html
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb3/igt@i915_pm_dc@dc5-dpms.html

  * igt@i915_pm_rps@reset:
    - shard-iclb:         [PASS][26] -> [FAIL][27] ([i915#413]) +1 similar issue
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb2/igt@i915_pm_rps@reset.html
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb1/igt@i915_pm_rps@reset.html

  * igt@i915_suspend@sysfs-reader:
    - shard-apl:          [PASS][28] -> [DMESG-WARN][29] ([i915#180]) +5 similar issues
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-apl4/igt@i915_suspend@sysfs-reader.html
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-apl1/igt@i915_suspend@sysfs-reader.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible:
    - shard-glk:          [PASS][30] -> [FAIL][31] ([i915#79])
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-glk2/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-glk5/igt@kms_flip@flip-vs-expired-vblank-interruptible.html

  * igt@kms_flip@plain-flip-ts-check-interruptible:
    - shard-glk:          [PASS][32] -> [FAIL][33] ([i915#34]) +2 similar issues
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-glk4/igt@kms_flip@plain-flip-ts-check-interruptible.html
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-glk7/igt@kms_flip@plain-flip-ts-check-interruptible.html

  * igt@kms_flip_tiling@flip-x-tiled:
    - shard-glk:          [PASS][34] -> [FAIL][35] ([fdo#108145] / [i915#699])
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-glk2/igt@kms_flip_tiling@flip-x-tiled.html
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-glk8/igt@kms_flip_tiling@flip-x-tiled.html

  * igt@kms_psr2_su@page_flip:
    - shard-iclb:         [PASS][36] -> [SKIP][37] ([fdo#109642] / [fdo#111068])
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb2/igt@kms_psr2_su@page_flip.html
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb5/igt@kms_psr2_su@page_flip.html

  * igt@kms_psr@psr2_cursor_render:
    - shard-iclb:         [PASS][38] -> [SKIP][39] ([fdo#109441]) +2 similar issues
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb2/igt@kms_psr@psr2_cursor_render.html
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb6/igt@kms_psr@psr2_cursor_render.html

  * igt@prime_busy@hang-bsd2:
    - shard-iclb:         [PASS][40] -> [SKIP][41] ([fdo#109276]) +24 similar issues
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb1/igt@prime_busy@hang-bsd2.html
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb8/igt@prime_busy@hang-bsd2.html

  
#### Possible fixes ####

  * igt@gem_ctx_persistence@vcs1-mixed-process:
    - shard-iclb:         [SKIP][42] ([fdo#109276] / [fdo#112080]) -> [PASS][43] +2 similar issues
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb8/igt@gem_ctx_persistence@vcs1-mixed-process.html
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb4/igt@gem_ctx_persistence@vcs1-mixed-process.html

  * igt@gem_exec_balancer@hang:
    - shard-iclb:         [INCOMPLETE][44] ([i915#140]) -> [PASS][45]
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb2/igt@gem_exec_balancer@hang.html
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb3/igt@gem_exec_balancer@hang.html

  * igt@gem_exec_schedule@pi-distinct-iova-bsd:
    - shard-iclb:         [SKIP][46] ([i915#677]) -> [PASS][47] +1 similar issue
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb4/igt@gem_exec_schedule@pi-distinct-iova-bsd.html
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb7/igt@gem_exec_schedule@pi-distinct-iova-bsd.html

  * igt@gem_exec_schedule@pi-shared-iova-bsd2:
    - shard-iclb:         [SKIP][48] ([fdo#109276]) -> [PASS][49] +15 similar issues
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb5/igt@gem_exec_schedule@pi-shared-iova-bsd2.html
   [49]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb4/igt@gem_exec_schedule@pi-shared-iova-bsd2.html

  * igt@gem_exec_schedule@preempt-bsd:
    - shard-iclb:         [SKIP][50] ([fdo#112146]) -> [PASS][51] +6 similar issues
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb2/igt@gem_exec_schedule@preempt-bsd.html
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb6/igt@gem_exec_schedule@preempt-bsd.html

  * igt@gem_persistent_relocs@forked-thrashing:
    - shard-hsw:          [INCOMPLETE][52] ([i915#530] / [i915#61]) -> [PASS][53]
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-hsw8/igt@gem_persistent_relocs@forked-thrashing.html
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-hsw7/igt@gem_persistent_relocs@forked-thrashing.html

  * igt@gem_ppgtt@flink-and-close-vma-leak:
    - shard-apl:          [FAIL][54] ([i915#644]) -> [PASS][55]
   [54]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-apl4/igt@gem_ppgtt@flink-and-close-vma-leak.html
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-apl1/igt@gem_ppgtt@flink-and-close-vma-leak.html

  * igt@i915_pm_rpm@system-suspend:
    - shard-kbl:          [INCOMPLETE][56] ([fdo#103665] / [i915#151]) -> [PASS][57]
   [56]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-kbl6/igt@i915_pm_rpm@system-suspend.html
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-kbl1/igt@i915_pm_rpm@system-suspend.html

  * igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy:
    - shard-glk:          [FAIL][58] ([i915#72]) -> [PASS][59]
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-glk1/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy.html
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-glk3/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-cpu:
    - shard-kbl:          [FAIL][60] ([i915#49]) -> [PASS][61]
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-kbl7/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-cpu.html
   [61]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-kbl7/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-cpu.html
    - shard-apl:          [FAIL][62] ([i915#49]) -> [PASS][63]
   [62]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-apl1/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-cpu.html
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-apl2/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-cpu.html

  * igt@kms_pipe_crc_basic@suspend-read-crc-pipe-a:
    - shard-kbl:          [DMESG-WARN][64] ([i915#180]) -> [PASS][65] +6 similar issues
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-kbl7/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-a.html
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-kbl3/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-a.html

  * igt@kms_psr2_su@frontbuffer:
    - shard-iclb:         [SKIP][66] ([fdo#109642] / [fdo#111068]) -> [PASS][67]
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb4/igt@kms_psr2_su@frontbuffer.html
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb2/igt@kms_psr2_su@frontbuffer.html

  * igt@kms_psr@psr2_sprite_plane_move:
    - shard-iclb:         [SKIP][68] ([fdo#109441]) -> [PASS][69]
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb1/igt@kms_psr@psr2_sprite_plane_move.html
   [69]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb2/igt@kms_psr@psr2_sprite_plane_move.html

  * igt@kms_vblank@pipe-a-ts-continuation-idle:
    - shard-snb:          [SKIP][70] ([fdo#109271]) -> [PASS][71] +1 similar issue
   [70]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-snb2/igt@kms_vblank@pipe-a-ts-continuation-idle.html
   [71]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-snb4/igt@kms_vblank@pipe-a-ts-continuation-idle.html

  * igt@perf_pmu@busy-vcs1:
    - shard-iclb:         [SKIP][72] ([fdo#112080]) -> [PASS][73] +6 similar issues
   [72]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb8/igt@perf_pmu@busy-vcs1.html
   [73]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb1/igt@perf_pmu@busy-vcs1.html

  
#### Warnings ####

  * igt@gem_ctx_isolation@vcs1-nonpriv:
    - shard-iclb:         [SKIP][74] ([fdo#109276] / [fdo#112080]) -> [FAIL][75] ([IGT#28])
   [74]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb8/igt@gem_ctx_isolation@vcs1-nonpriv.html
   [75]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb1/igt@gem_ctx_isolation@vcs1-nonpriv.html

  * igt@gem_eio@kms:
    - shard-snb:          [INCOMPLETE][76] ([i915#82]) -> [DMESG-WARN][77] ([i915#444] / [i915#503])
   [76]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-snb5/igt@gem_eio@kms.html
   [77]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-snb4/igt@gem_eio@kms.html

  * igt@gem_persistent_relocs@forked-faulting-reloc-thrashing:
    - shard-kbl:          [INCOMPLETE][78] ([fdo#103665] / [i915#530]) -> [TIMEOUT][79] ([fdo#112271] / [i915#530])
   [78]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-kbl1/igt@gem_persistent_relocs@forked-faulting-reloc-thrashing.html
   [79]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-kbl3/igt@gem_persistent_relocs@forked-faulting-reloc-thrashing.html

  * igt@gem_userptr_blits@dmabuf-unsync:
    - shard-snb:          [DMESG-WARN][80] ([fdo#110789] / [fdo#111870] / [i915#478]) -> [DMESG-WARN][81] ([fdo#111870] / [i915#478])
   [80]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-snb1/igt@gem_userptr_blits@dmabuf-unsync.html
   [81]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-snb5/igt@gem_userptr_blits@dmabuf-unsync.html

  * igt@i915_pm_rpm@modeset-non-lpsp:
    - shard-snb:          [SKIP][82] ([fdo#109271]) -> [INCOMPLETE][83] ([i915#82])
   [82]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-snb4/igt@i915_pm_rpm@modeset-non-lpsp.html
   [83]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-snb5/igt@i915_pm_rpm@modeset-non-lpsp.html

  * igt@kms_dp_dsc@basic-dsc-enable-edp:
    - shard-iclb:         [SKIP][84] ([fdo#109349]) -> [DMESG-WARN][85] ([fdo#107724])
   [84]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-iclb6/igt@kms_dp_dsc@basic-dsc-enable-edp.html
   [85]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-iclb2/igt@kms_dp_dsc@basic-dsc-enable-edp.html

  * igt@runner@aborted:
    - shard-glk:          [FAIL][86] ([i915#873] / [k.org#202321]) -> ([FAIL][87], [FAIL][88], [FAIL][89], [FAIL][90]) ([i915#873] / [i915#997] / [k.org#202321])
   [86]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-glk7/igt@runner@aborted.html
   [87]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-glk4/igt@runner@aborted.html
   [88]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-glk3/igt@runner@aborted.html
   [89]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-glk8/igt@runner@aborted.html
   [90]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-glk8/igt@runner@aborted.html
    - shard-snb:          [FAIL][91] ([i915#873]) -> ([FAIL][92], [FAIL][93]) ([i915#436] / [i915#873])
   [91]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7772/shard-snb5/igt@runner@aborted.html
   [92]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-snb4/igt@runner@aborted.html
   [93]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/shard-snb2/igt@runner@aborted.html

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

  [CI#80]: https://gitlab.freedesktop.org/gfx-ci/i915-infra/issues/80
  [IGT#28]: https://gitlab.freedesktop.org/drm/igt-gpu-tools/issues/28
  [fdo#103665]: https://bugs.freedesktop.org/show_bug.cgi?id=103665
  [fdo#103927]: https://bugs.freedesktop.org/show_bug.cgi?id=103927
  [fdo#107724]: https://bugs.freedesktop.org/show_bug.cgi?id=107724
  [fdo#108145]: https://bugs.freedesktop.org/show_bug.cgi?id=108145
  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109276]: https://bugs.freedesktop.org/show_bug.cgi?id=109276
  [fdo#109349]: https://bugs.freedesktop.org/show_bug.cgi?id=109349
  [fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
  [fdo#109642]: https://bugs.freedesktop.org/show_bug.cgi?id=109642
  [fdo#110789]: https://bugs.freedesktop.org/show_bug.cgi?id=110789
  [fdo#111068]: https://bugs.freedesktop.org/show_bug.cgi?id=111068
  [fdo#111870]: https://bugs.freedesktop.org/show_bug.cgi?id=111870
  [fdo#112080]: https://bugs.freedesktop.org/show_bug.cgi?id=112080
  [fdo#112146]: https://bugs.freedesktop.org/show_bug.cgi?id=112146
  [fdo#112271]: https://bugs.freedesktop.org/show_bug.cgi?id=112271
  [i915#140]: https://gitlab.freedesktop.org/drm/intel/issues/140
  [i915#151]: https://gitlab.freedesktop.org/drm/intel/issues/151
  [i915#180]: https://gitlab.freedesktop.org/drm/intel/issues/180
  [i915#34]: https://gitlab.freedesktop.org/drm/intel/issues/34
  [i915#413]: https://gitlab.freedesktop.org/drm/intel/issues/413
  [i915#436]: https://gitlab.freedesktop.org/drm/intel/issues/436
  [i915#444]: https://gitlab.freedesktop.org/drm/intel/issues/444
  [i915#447]: https://gitlab.freedesktop.org/drm/intel/issues/447
  [i915#478]: https://gitlab.freedesktop.org/drm/intel/issues/478
  [i915#49]: https://gitlab.freedesktop.org/drm/intel/issues/49
  [i915#503]: https://gitlab.freedesktop.org/drm/intel/issues/503
  [i915#520]: https://gitlab.freedesktop.org/drm/intel/issues/520
  [i915#530]: https://gitlab.freedesktop.org/drm/intel/issues/530
  [i915#61]: https://gitlab.freedesktop.org/drm/intel/issues/61
  [i915#644]: https://gitlab.freedesktop.org/drm/intel/issues/644
  [i915#677]: https://gitlab.freedesktop.org/drm/intel/issues/677
  [i915#699]: https://gitlab.freedesktop.org/drm/intel/issues/699
  [i915#716]: https://gitlab.freedesktop.org/drm/intel/issues/716
  [i915#72]: https://gitlab.freedesktop.org/drm/intel/issues/72
  [i915#79]: https://gitlab.freedesktop.org/drm/intel/issues/79
  [i915#82]: https://gitlab.freedesktop.org/drm/intel/issues/82
  [i915#873]: https://gitlab.freedesktop.org/drm/intel/issues/873
  [i915#997]: https://gitlab.freedesktop.org/drm/intel/issues/997
  [k.org#202321]: https://bugzilla.kernel.org/show_bug.cgi?id=202321


Participating hosts (10 -> 8)
------------------------------

  Missing    (2): pig-skl-6260u pig-glk-j5005 


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

  * CI: CI-20190529 -> None
  * IGT: IGT_5372 -> IGTPW_3945
  * Piglit: piglit_4509 -> None

  CI-20190529: 20190529
  CI_DRM_7772: f65c394056d8637ff151fa83d5d1613adc0932d2 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_3945: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/index.html
  IGT_5372: 0d00a27fbbd4d4a77d24499ea9811e07e65eb0ac @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3945/index.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

end of thread, other threads:[~2020-01-21  0:01 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-18 22:16 [Intel-gfx] [PATCH i-g-t] i915: Exercise VM_WAIT ioctl Chris Wilson
2020-01-18 22:16 ` [igt-dev] " Chris Wilson
2020-01-18 22:44 ` [igt-dev] ✓ Fi.CI.BAT: success for " Patchwork
2020-01-21  0:01 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork

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.