summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-03-19 14:21:34 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2016-03-19 15:21:28 +0000
commit83cfed8c396a0a5b08c498829fe68d2b10af8425 (patch)
tree4a5e0688caa234e01aa88db3000452498f23f969 /tests
parent87cad37c7849800b0e17ac55431ad3c1131739d4 (diff)
igt/gem_exec_whisper: Add interruptibles tests
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'tests')
-rw-r--r--tests/gem_exec_whisper.c233
1 files changed, 121 insertions, 112 deletions
diff --git a/tests/gem_exec_whisper.c b/tests/gem_exec_whisper.c
index 30f26088..8d2569a0 100644
--- a/tests/gem_exec_whisper.c
+++ b/tests/gem_exec_whisper.c
@@ -107,6 +107,7 @@ static bool ignore_engine(int gen, unsigned engine)
#define CONTEXTS 0x1
#define FDS 0x2
+#define INTERRUPTIBLE 0x4
static void whisper(int fd, unsigned engine, unsigned flags)
{
@@ -214,107 +215,109 @@ static void whisper(int fd, unsigned engine, unsigned flags)
gem_write(fd, batches[n].handle, 0, batch, sizeof(batch));
}
- for (pass = 0; pass < 1024; pass++) {
- uint64_t offset;
-
- write_seqno(pass);
-
- reloc.presumed_offset = scratch.offset;
- reloc.delta = 4*pass;
- offset = reloc.presumed_offset + reloc.delta;
-
- i = 0;
- if (gen >= 8) {
- batch[++i] = offset;
- batch[++i] = offset >> 32;
- } else if (gen >= 4) {
- batch[++i] = 0;
- batch[++i] = offset;
- } else {
- batch[++i] = offset;
- }
- batch[++i] = ~pass;
- gem_write(fd, store.handle, 0, batch, sizeof(batch));
-
- tmp[0] = scratch;
- tmp[1] = store;
- verify_reloc(fd, store.handle, &reloc);
- execbuf.buffers_ptr = (uintptr_t)tmp;
- gem_execbuf(fd, &execbuf);
- reloc_migrations += reloc.presumed_offset == -1;
- igt_assert_eq_u64(reloc.presumed_offset, tmp[0].offset);
- scratch = tmp[0];
-
- gem_write(fd, batches[1023].handle, loc, &pass, sizeof(pass));
- for (n = 1024; --n >= 1; ) {
- int this_fd = fd;
- uint32_t handle[2];
-
- execbuf.buffers_ptr = (uintptr_t)&batches[n-1];
- batches[n-1].offset = inter[n].presumed_offset;
- batches[n-1].relocation_count = 0;
- batches[n-1].flags |= EXEC_OBJECT_WRITE;
- verify_reloc(fd, batches[n].handle, &inter[n]);
-
- if (flags & FDS) {
- this_fd = fds[rand() % 64];
- handle[0] = batches[n-1].handle;
- handle[1] = batches[n].handle;
- batches[n-1].handle =
- gem_open(this_fd,
- gem_flink(fd, handle[0]));
- batches[n].handle =
- gem_open(this_fd,
- gem_flink(fd, handle[1]));
+ igt_interruptible(flags & INTERRUPTIBLE) {
+ for (pass = 0; pass < 1024; pass++) {
+ uint64_t offset;
+
+ write_seqno(pass);
+
+ reloc.presumed_offset = scratch.offset;
+ reloc.delta = 4*pass;
+ offset = reloc.presumed_offset + reloc.delta;
+
+ i = 0;
+ if (gen >= 8) {
+ batch[++i] = offset;
+ batch[++i] = offset >> 32;
+ } else if (gen >= 4) {
+ batch[++i] = 0;
+ batch[++i] = offset;
+ } else {
+ batch[++i] = offset;
}
-
- execbuf.flags &= ~ENGINE_MASK;
- execbuf.flags |= engines[rand() % nengine];
- if (flags & CONTEXTS)
- execbuf.rsvd1 = contexts[rand() % 64];
- gem_execbuf(this_fd, &execbuf);
- reloc_migrations += inter[n].presumed_offset == -1;
- inter[n].presumed_offset = batches[n-1].offset;
-
- batches[n-1].relocation_count = 1;
- batches[n-1].flags &= ~EXEC_OBJECT_WRITE;
-
- if (this_fd != fd) {
- gem_close(this_fd, batches[n-1].handle);
- batches[n-1].handle = handle[0];
-
- gem_close(this_fd, batches[n].handle);
- batches[n].handle = handle[1];
+ batch[++i] = ~pass;
+ gem_write(fd, store.handle, 0, batch, sizeof(batch));
+
+ tmp[0] = scratch;
+ tmp[1] = store;
+ verify_reloc(fd, store.handle, &reloc);
+ execbuf.buffers_ptr = (uintptr_t)tmp;
+ gem_execbuf(fd, &execbuf);
+ reloc_migrations += reloc.presumed_offset == -1;
+ igt_assert_eq_u64(reloc.presumed_offset, tmp[0].offset);
+ scratch = tmp[0];
+
+ gem_write(fd, batches[1023].handle, loc, &pass, sizeof(pass));
+ for (n = 1024; --n >= 1; ) {
+ int this_fd = fd;
+ uint32_t handle[2];
+
+ execbuf.buffers_ptr = (uintptr_t)&batches[n-1];
+ batches[n-1].offset = inter[n].presumed_offset;
+ batches[n-1].relocation_count = 0;
+ batches[n-1].flags |= EXEC_OBJECT_WRITE;
+ verify_reloc(fd, batches[n].handle, &inter[n]);
+
+ if (flags & FDS) {
+ this_fd = fds[rand() % 64];
+ handle[0] = batches[n-1].handle;
+ handle[1] = batches[n].handle;
+ batches[n-1].handle =
+ gem_open(this_fd,
+ gem_flink(fd, handle[0]));
+ batches[n].handle =
+ gem_open(this_fd,
+ gem_flink(fd, handle[1]));
+ }
+
+ execbuf.flags &= ~ENGINE_MASK;
+ execbuf.flags |= engines[rand() % nengine];
+ if (flags & CONTEXTS)
+ execbuf.rsvd1 = contexts[rand() % 64];
+ gem_execbuf(this_fd, &execbuf);
+ reloc_migrations += inter[n].presumed_offset == -1;
+ inter[n].presumed_offset = batches[n-1].offset;
+
+ batches[n-1].relocation_count = 1;
+ batches[n-1].flags &= ~EXEC_OBJECT_WRITE;
+
+ if (this_fd != fd) {
+ gem_close(this_fd, batches[n-1].handle);
+ batches[n-1].handle = handle[0];
+
+ gem_close(this_fd, batches[n].handle);
+ batches[n].handle = handle[1];
+ }
}
+ execbuf.flags &= ~ENGINE_MASK;
+ execbuf.rsvd1 = 0;
+ execbuf.buffers_ptr = (uintptr_t)&tmp;
+
+ tmp[0] = tmp[1];
+ tmp[0].relocation_count = 0;
+ tmp[0].flags = EXEC_OBJECT_WRITE;
+ tmp[0].offset = inter[0].presumed_offset;
+ tmp[1] = batches[0];
+ verify_reloc(fd, batches[0].handle, &inter[0]);
+ gem_execbuf(fd, &execbuf);
+ reloc_migrations += inter[0].presumed_offset == -1;
+ batches[0] = tmp[1];
+
+ tmp[1] = tmp[0];
+ tmp[0] = scratch;
+ igt_assert_eq_u64(reloc.presumed_offset, tmp[0].offset);
+ igt_assert(tmp[1].relocs_ptr == (uintptr_t)&reloc);
+ tmp[1].relocation_count = 1;
+ tmp[1].flags &= ~EXEC_OBJECT_WRITE;
+ verify_reloc(fd, store.handle, &reloc);
+ gem_execbuf(fd, &execbuf);
+ eb_migrations += tmp[0].offset != scratch.offset;
+ eb_migrations += tmp[1].offset != store.offset;
+ reloc_migrations += reloc.presumed_offset == -1;
+ igt_assert_eq_u64(reloc.presumed_offset, tmp[0].offset);
+ store = tmp[1];
+ scratch = tmp[0];
}
- execbuf.flags &= ~ENGINE_MASK;
- execbuf.rsvd1 = 0;
- execbuf.buffers_ptr = (uintptr_t)&tmp;
-
- tmp[0] = tmp[1];
- tmp[0].relocation_count = 0;
- tmp[0].flags = EXEC_OBJECT_WRITE;
- tmp[0].offset = inter[0].presumed_offset;
- tmp[1] = batches[0];
- verify_reloc(fd, batches[0].handle, &inter[0]);
- gem_execbuf(fd, &execbuf);
- reloc_migrations += inter[0].presumed_offset == -1;
- batches[0] = tmp[1];
-
- tmp[1] = tmp[0];
- tmp[0] = scratch;
- igt_assert_eq_u64(reloc.presumed_offset, tmp[0].offset);
- igt_assert(tmp[1].relocs_ptr == (uintptr_t)&reloc);
- tmp[1].relocation_count = 1;
- tmp[1].flags &= ~EXEC_OBJECT_WRITE;
- verify_reloc(fd, store.handle, &reloc);
- gem_execbuf(fd, &execbuf);
- eb_migrations += tmp[0].offset != scratch.offset;
- eb_migrations += tmp[1].offset != store.offset;
- reloc_migrations += reloc.presumed_offset == -1;
- igt_assert_eq_u64(reloc.presumed_offset, tmp[0].offset);
- store = tmp[1];
- scratch = tmp[0];
}
igt_info("Number of migrations for execbuf: %d\n", eb_migrations);
igt_info("Number of migrations for reloc: %d\n", reloc_migrations);
@@ -337,28 +340,34 @@ static void whisper(int fd, unsigned engine, unsigned flags)
igt_main
{
+ const struct mode {
+ const char *name;
+ unsigned flags;
+ } modes[] = {
+ { "", 0 },
+ { "contexts", CONTEXTS },
+ { "contexts-interruptible", CONTEXTS | INTERRUPTIBLE},
+ { "fds", FDS },
+ { "fds-interruptible", FDS | INTERRUPTIBLE},
+ { NULL }
+ };
int fd;
igt_fixture
fd = drm_open_driver_master(DRIVER_INTEL);
- igt_subtest("basic")
- whisper(fd, -1, 0);
-
- igt_subtest("contexts")
- whisper(fd, -1, CONTEXTS);
-
- igt_subtest("fds")
- whisper(fd, -1, FDS);
+ for (const struct mode *m = modes; m->name; m++)
+ igt_subtest_f("%s", *m->name ? m->name : "basic")
+ whisper(fd, -1, m->flags);
for (const struct intel_execution_engine *e = intel_execution_engines;
e->name; e++) {
- igt_subtest_f("normal-%s", e->name)
- whisper(fd, e->exec_id | e->flags, 0);
- igt_subtest_f("contexts-%s", e->name)
- whisper(fd, e->exec_id | e->flags, CONTEXTS);
- igt_subtest_f("fds-%s", e->name)
- whisper(fd, e->exec_id | e->flags, FDS);
+ for (const struct mode *m = modes; m->name; m++)
+ igt_subtest_f("%s%s%s",
+ e->name,
+ *m->name ? "-" : "",
+ m->name)
+ whisper(fd, e->exec_id | e->flags, m->flags);
}
igt_fixture