[PATCH i-g-t 16/16] i915/gem_exec_latency: Add another variant of waiter latency

Chris Wilson
2019-05-08T10:09:58Z

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
---
tests/i915/gem_exec_latency.c | 81 +++++++++++++++++++++++++++++++++++
1 file changed, 81 insertions(+)

diff --git a/tests/i915/gem_exec_latency.c b/tests/i915/gem_exec_latency.c
index e88fbbc6a..fd4ceb4d6 100644
--- a/tests/i915/gem_exec_latency.c
+++ b/tests/i915/gem_exec_latency.c
@@ -490,6 +490,83 @@ static void execution_latency(int i915, unsigned int ring, const char *name)
gem_close(i915, obj.handle);
}

+static void wakeup_latency(int i915, unsigned int ring, const char *name)
+{
+ struct drm_i915_gem_exec_object2 obj = {
+ .handle = gem_create(i915, 4095),
+ };
+ struct drm_i915_gem_execbuffer2 execbuf = {
+ .buffers_ptr = to_user_pointer(&obj),
+ .buffer_count = 1,
+ .flags = ring | LOCAL_I915_EXEC_NO_RELOC | LOCAL_I915_EXEC_HANDLE_LUT,
+ };
+ const unsigned int mmio_base = 0x2000;
+ const unsigned int cs_timestamp = mmio_base + 0x358;
+ volatile uint32_t *timestamp;
+ struct igt_mean wakeup;
+ uint32_t *cs, *result;
+
+ timestamp =
+ (volatile uint32_t *)((volatile char *)igt_global_mmio + cs_timestamp);
+
+ obj.handle = gem_create(i915, 4096);
+ obj.flags = EXEC_OBJECT_PINNED;
+ result = gem_mmap__wc(i915, obj.handle, 0, 4096, PROT_WRITE);
+
+ cs = result;
+
+ *cs++ = 0x24 << 23 | 2; /* SRM */
+ *cs++ = cs_timestamp;
+ *cs++ = 4096 - 16 * 4;
+ *cs++ = 0;
+
+ *cs++ = MI_BATCH_BUFFER_START | 1;
+ *cs++ = 0;
+ *cs++ = 0;
+
+ *cs++ = 0x24 << 23 | 2; /* SRM */
+ *cs++ = cs_timestamp;
+ *cs++ = 4096 - 16 * 4 + 4;
+ *cs++ = 0;
+ *cs++ = 0xa << 23;
+
+ cs = result + 1024 - 16;
+
+ {
+ struct sched_param p = { .sched_priority = 99 };
+ sched_setscheduler(0, SCHED_FIFO | SCHED_RESET_ON_FORK, &p);
+ }
+
+ igt_mean_init(&wakeup);
+ igt_until_timeout(2) {
+ uint32_t end;
+
+ igt_fork(child, 1) {
+ result[4] = MI_BATCH_BUFFER_START | 1;
+ cs[0] = 0;
+
+ gem_execbuf(i915, &execbuf);
+
+ while (!cs[0])
+ ;
+ result[4] = 0;
+ __sync_synchronize();
+ }
+ gem_sync(i915, obj.handle);
+ end = *timestamp;
+
+ igt_mean_add(&wakeup, (end - cs[1]) * rcs_clock);
+ igt_waitchildren();
+ }
+ igt_info("%s Wakeup latency: %.2f±%.2fms [%.2f, %.2f]\n", name,
+ 1e-6 * igt_mean_get(&wakeup),
+ 1e-6 * sqrt(igt_mean_get_variance(&wakeup)),
+ 1e-6 * wakeup.min, 1e-6 * wakeup.max);
+
+ munmap(result, 4096);
+ gem_close(i915, obj.handle);
+}
+
static void
__submit_spin(int fd, igt_spin_t *spin, unsigned int flags)
{
@@ -942,6 +1019,10 @@ igt_main
execution_latency(device,
e->exec_id | e->flags,
e->name);
+ igt_subtest_f("%s-wakeup-latency", e->name)
+ wakeup_latency(device,
+ e->exec_id | e->flags,
+ e->name);

igt_subtest_f("%s-live-dispatch-queued", e->name)
latency_on_ring(device,
--
2.20.1