* [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.