On Thu, Apr 20, 2017 at 03:23:27PM +0100, Chris Wilson wrote: > You either want to reset presumed_offset=-1 each time, or better for all > concerned write the correct address alongside the seqno (which also > enables NORELOC). > > Delta incoming. See attached. Next concern is that I have full rings which implies that we are not waiting on each batch before resubmitting with a new seqno? If I throw a assert(!busy(batch_bo)) before the *b->mapped_seqno am I going to be upset? -Chris -- Chris Wilson, Intel Open Source Technology Centre
>From 5bf424c2719e81f926b74f4136610cbdfd26a4d8 Mon Sep 17 00:00:00 2001 From: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> Date: Thu, 20 Apr 2017 15:30:07 +0100 Subject: [PATCH] seqno-reloc --- benchmarks/gem_wsim.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/benchmarks/gem_wsim.c b/benchmarks/gem_wsim.c index adf2d6de..e616335b 100644 --- a/benchmarks/gem_wsim.c +++ b/benchmarks/gem_wsim.c @@ -45,6 +45,8 @@ #include "drmtest.h" #include "intel_io.h" +#define LOCAL_I915_GEM_DOMAIN_WC 0x80 + enum intel_engine_id { RCS, BCS, @@ -86,7 +88,9 @@ struct w_step struct drm_i915_gem_relocation_entry reloc; unsigned long bb_sz; uint32_t bb_handle; - uint32_t *mapped_batch, *mapped_seqno; + uint32_t *mapped_batch; + uint64_t *mapped_address; + uint32_t *mapped_seqno; unsigned int mapped_len; } b[2]; /* One for each VCS when load balancing */ }; @@ -405,7 +409,8 @@ terminate_bb(struct w_step *w, struct w_step_eb *b, enum intel_engine_id engine, mmap_len += cmd_offset - mmap_start; gem_set_domain(fd, b->bb_handle, - I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU); + LOCAL_I915_GEM_DOMAIN_WC, + LOCAL_I915_GEM_DOMAIN_WC); ptr = gem_mmap__wc(fd, b->bb_handle, mmap_start, mmap_len, PROT_WRITE); cs = (uint32_t *)((char *)ptr + cmd_offset - mmap_start); @@ -415,6 +420,7 @@ terminate_bb(struct w_step *w, struct w_step_eb *b, enum intel_engine_id engine, b->reloc.delta = (engine - VCS1) * sizeof(uint32_t); *cs++ = MI_STORE_DWORD_IMM; + b->mapped_address = (uint64_t *)cs; *cs++ = 0; *cs++ = 0; b->mapped_seqno = cs; @@ -469,7 +475,6 @@ alloc_step_batch(struct workload *wrk, struct w_step *w, struct w_step_eb *b, } if (flags & SEQNO) { - b->reloc.presumed_offset = -1; b->reloc.target_handle = 1; b->obj[bb_i].relocs_ptr = to_user_pointer(&b->reloc); b->obj[bb_i].relocation_count = 1; @@ -485,8 +490,7 @@ alloc_step_batch(struct workload *wrk, struct w_step *w, struct w_step_eb *b, engine = VCS1; b->eb.flags = eb_engine_map[engine]; b->eb.flags |= I915_EXEC_HANDLE_LUT; - if (!(flags & SEQNO)) - b->eb.flags |= I915_EXEC_NO_RELOC; + b->eb.flags |= I915_EXEC_NO_RELOC; #ifdef DEBUG printf("%u: %u:%x|%x|%x|%x %10lu flags=%llx bb=%x[%u] ctx[%u]=%u\n", w->idx, b->eb.buffer_count, b->obj[0].handle, @@ -628,8 +632,9 @@ static void update_bb_seqno(struct w_step_eb *b, enum intel_engine_id engine, uint32_t seqno) { - *b->mapped_seqno = seqno; b->reloc.delta = (engine - VCS1) * sizeof(uint32_t); + *b->mapped_address = b->reloc.presumed_offset + b->reloc.delta; + *b->mapped_seqno = seqno; } static void -- 2.11.0
_______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx