summaryrefslogtreecommitdiff
path: root/tests/i915
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2019-01-22 23:17:51 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2019-03-26 10:37:58 +0000
commit601b3ed82b80b45f7b60a620e6609eb0a4b721df (patch)
treeeb6815821915c1c75ce21064313615f15c3a8e1b /tests/i915
parent2551ed1864985d2fe1c250337f86c7b2bc670c67 (diff)
i915/gem_sync: Make switch-default asymmetric
To make the demonstration of the cheeky preemption more impactful, make the second context a nop to contrast the first being 1024 MI_STORE_DWORD_IMM. Then if we execute and wait on the second context before executing the first, the client latency is even more drastically reduced. To more clearly show any effect on wait reordering, measure the alternative path and present both. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Diffstat (limited to 'tests/i915')
-rw-r--r--tests/i915/gem_sync.c40
1 files changed, 29 insertions, 11 deletions
diff --git a/tests/i915/gem_sync.c b/tests/i915/gem_sync.c
index fb209977..3e4feff3 100644
--- a/tests/i915/gem_sync.c
+++ b/tests/i915/gem_sync.c
@@ -651,7 +651,7 @@ switch_ring(int fd, unsigned ring, int num_children, int timeout)
struct drm_i915_gem_relocation_entry reloc[1024];
struct drm_i915_gem_execbuffer2 execbuf;
} contexts[2];
- double start, elapsed;
+ double elapsed, baseline;
unsigned long cycles;
for (int i = 0; i < ARRAY_SIZE(contexts); i++) {
@@ -679,7 +679,7 @@ switch_ring(int fd, unsigned ring, int num_children, int timeout)
c->object[1].handle = gem_create(fd, sz);
c->object[1].relocs_ptr = to_user_pointer(c->reloc);
- c->object[1].relocation_count = 1024;
+ c->object[1].relocation_count = 1024 * i;
batch = gem_mmap__cpu(fd, c->object[1].handle, 0, sz,
PROT_WRITE | PROT_READ);
@@ -688,7 +688,7 @@ switch_ring(int fd, unsigned ring, int num_children, int timeout)
memset(c->reloc, 0, sizeof(c->reloc));
b = batch;
- for (int r = 0; r < 1024; r++) {
+ for (int r = 0; r < c->object[1].relocation_count; r++) {
uint64_t offset;
c->reloc[r].presumed_offset = c->object[0].offset;
@@ -722,26 +722,44 @@ switch_ring(int fd, unsigned ring, int num_children, int timeout)
}
cycles = 0;
- elapsed = 0;
- start = gettime();
- do {
+ baseline = 0;
+ igt_until_timeout(timeout) {
do {
double this;
- gem_execbuf(fd, &contexts[0].execbuf);
gem_execbuf(fd, &contexts[1].execbuf);
+ gem_execbuf(fd, &contexts[0].execbuf);
this = gettime();
gem_sync(fd, contexts[1].object[1].handle);
- elapsed += gettime() - this;
+ gem_sync(fd, contexts[0].object[1].handle);
+ baseline += gettime() - this;
+ } while (++cycles & 1023);
+ }
+ baseline /= cycles;
+
+ cycles = 0;
+ elapsed = 0;
+ igt_until_timeout(timeout) {
+ do {
+ double this;
+ gem_execbuf(fd, &contexts[1].execbuf);
+ gem_execbuf(fd, &contexts[0].execbuf);
+
+ this = gettime();
gem_sync(fd, contexts[0].object[1].handle);
+ elapsed += gettime() - this;
+
+ gem_sync(fd, contexts[1].object[1].handle);
} while (++cycles & 1023);
- } while ((gettime() - start) < timeout);
- igt_info("%s%sompleted %ld cycles: %.3f us\n",
+ }
+ elapsed /= cycles;
+
+ igt_info("%s%sompleted %ld cycles: %.3f us, baseline %.3f us\n",
names[child % num_engines] ?: "",
names[child % num_engines] ? " c" : "C",
- cycles, elapsed*1e6/cycles);
+ cycles, elapsed*1e6, baseline*1e6);
for (int i = 0; i < ARRAY_SIZE(contexts); i++) {
gem_close(fd, contexts[i].object[1].handle);