summaryrefslogtreecommitdiff
path: root/benchmarks
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2017-05-09 13:41:01 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2017-05-09 15:36:54 +0100
commit7d1362ac71391c9a2d6e6766265c5afeae2c8e1a (patch)
treedc489fc118a695e68a446534ec2d720f13cd4ac8 /benchmarks
parent5be0563757bccc222cd75406bc804bdaeb97be77 (diff)
wsim: Send a periodic depth stamp down each queue
In order to measure external load (from other clients), we need a periodic marker along each queue. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'benchmarks')
-rw-r--r--benchmarks/gem_wsim.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/benchmarks/gem_wsim.c b/benchmarks/gem_wsim.c
index b193378e..3da8499b 100644
--- a/benchmarks/gem_wsim.c
+++ b/benchmarks/gem_wsim.c
@@ -925,6 +925,73 @@ static void w_sync_to(struct workload *wrk, struct w_step *w, int target)
gem_sync(fd, wrk->steps[target].obj[0].handle);
}
+static void init_status_page(struct workload *wrk)
+{
+ struct drm_i915_gem_exec_object2 obj[2] = {};
+ struct drm_i915_gem_relocation_entry reloc[3] = {};
+ struct drm_i915_gem_execbuffer2 eb = {
+ .buffer_count = 2, .buffers_ptr = to_user_pointer(obj)
+ };
+
+ /* Want to make sure that the balancer has a reasonable view of
+ * the background busyness of each engine. To do that we occasionally
+ * send a dummy batch down the pipeline.
+ */
+
+ if (!wrk->status_page_handle)
+ return;
+
+ obj[0].handle = wrk->status_page_handle;
+ obj[1].relocs_ptr = to_user_pointer(reloc);
+ obj[1].relocation_count = ARRAY_SIZE(reloc);
+
+ reloc[0].offset = sizeof(uint32_t);
+ reloc[1].offset = 5 * sizeof(uint32_t);
+ reloc[2].offset = 10 * sizeof(uint32_t);
+
+ for (int engine = VCS1; engine <= VCS2; engine++) {
+ uint32_t *cs, *base;
+ uint64_t addr;
+
+ reloc[0].delta = VCS_SEQNO_OFFSET(engine);
+ reloc[1].delta = VCS_SEQNO_OFFSET(engine) + sizeof(uint32_t);
+ reloc[2].delta = VCS_SEQNO_OFFSET(engine) + 2 * sizeof(uint32_t);
+
+ obj[1].handle = gem_create(fd, 4096);
+
+ base = gem_mmap__cpu(fd, obj[1].handle, 0, 4096, PROT_WRITE);
+ cs = base;
+
+ addr = reloc[0].presumed_offset + reloc[0].delta;
+ *cs++ = MI_STORE_DWORD_IMM;
+ *cs++ = addr;
+ *cs++ = addr >> 32;
+ *cs++ = ++wrk->seqno[engine];
+
+ addr = reloc[1].presumed_offset + reloc[1].delta;
+ *cs++ = MI_STORE_DWORD_IMM;
+ *cs++ = addr;
+ *cs++ = addr >> 32;
+ *cs++ = *REG(RCS_TIMESTAMP);
+
+ addr = reloc[2].presumed_offset + reloc[2].delta;
+ *cs++ = 0x24 << 23 | 2; /* MI_STORE_REG_MEM */
+ *cs++ = RCS_TIMESTAMP;
+ *cs++ = addr;
+ *cs++ = addr >> 32;
+
+ *cs++ = MI_BATCH_BUFFER_END;
+ munmap(base, 4096);
+
+ eb.flags = eb_engine_map[engine];
+ eb.flags |= I915_EXEC_HANDLE_LUT;
+ eb.flags |= I915_EXEC_NO_RELOC;
+
+ gem_execbuf(fd, &eb);
+ gem_close(fd, obj[1].handle);
+ }
+}
+
static void
run_workload(unsigned int id, struct workload *wrk,
bool background, int pipe_fd,
@@ -946,6 +1013,7 @@ run_workload(unsigned int id, struct workload *wrk,
for (j = 0; run && (background || j < repeat); j++) {
clock_gettime(CLOCK_MONOTONIC, &wrk->repeat_start);
+ init_status_page(wrk);
for (i = 0, w = wrk->steps; run && (i < wrk->nr_steps);
i++, w++) {