[igt-dev] [PATCH i-g-t] tests/i915_module_load: obj size based on the engine count
Chris Wilson
chris at chris-wilson.co.uk
Fri Feb 5 09:53:49 UTC 2021
Quoting Ramalingam C (2021-02-05 09:07:43)
> Calculate obj size for the sanity check of module reload
> based on the engines count.
>
> Signed-off-by: Ramalingam C <ramalingam.c at intel.com>
> CC: Chris wilson <chris.p.wilson at intel.com>
Oh dear, I've seen a few more things that got lost in translation.
> ---
> tests/i915/i915_module_load.c | 37 +++++++++++++++++++++--------------
> 1 file changed, 22 insertions(+), 15 deletions(-)
>
> diff --git a/tests/i915/i915_module_load.c b/tests/i915/i915_module_load.c
> index 06522ba6191b..00494bcb3480 100644
> --- a/tests/i915/i915_module_load.c
> +++ b/tests/i915/i915_module_load.c
> @@ -46,7 +46,7 @@ static void store_all(int fd)
> struct drm_i915_gem_relocation_entry reloc[2 * ARRAY_SIZE(engines)];
> struct drm_i915_gem_execbuffer2 execbuf;
> const struct intel_execution_engine2 *e;
> - uint32_t batch[16];
> + uint32_t batch[16], obj_size;
> uint64_t offset;
> unsigned nengine;
> int value;
> @@ -56,10 +56,19 @@ static void store_all(int fd)
> execbuf.buffers_ptr = (uintptr_t)obj;
> execbuf.buffer_count = 2;
>
> + nengine = 0;
> + __for_each_physical_engine(fd, e) {
> + if (!gem_class_can_store_dword(fd, e->class))
> + continue;
> + nengine++;
> + }
> +
> + obj_size = 2 * (nengine + 1) *sizeof(batch);
> +
> memset(reloc, 0, sizeof(reloc));
> memset(obj, 0, sizeof(obj));
> - obj[0].handle = gem_create(fd, 4096);
> - obj[1].handle = gem_create(fd, 4096);
> + obj[0].handle = gem_create(fd, obj_size);
obj[0] needs only 4 * nengine
obj[1] indeed needs batch_size * nengine;
> + obj[1].handle = gem_create(fd, obj_size);
> obj[1].relocation_count = 1;
>
> offset = sizeof(uint32_t);
> @@ -79,24 +88,22 @@ static void store_all(int fd)
> batch[value = ++i] = 0xc0ffee;
> batch[++i] = MI_BATCH_BUFFER_END;
>
> - nengine = 0;
> + i = 0;
> intel_detect_and_clear_missed_interrupts(fd);
> __for_each_physical_engine(fd, e) {
> if (!gem_class_can_store_dword(fd, e->class))
> continue;
>
> - igt_assert(2 * (nengine + 1) * sizeof(batch) <= 4096);
> -
> - engines[nengine] = e->flags;
> + engines[i] = e->flags;
> if (gen < 6)
> - engines[nengine] |= I915_EXEC_SECURE;
> - execbuf.flags = engines[nengine];
> + engines[i] |= I915_EXEC_SECURE;
> + execbuf.flags = engines[i];
>
> - j = 2*nengine;
> + j = 2*i;
> reloc[j].target_handle = obj[0].handle;
> reloc[j].presumed_offset = ~0;
> reloc[j].offset = j*sizeof(batch) + offset;
> - reloc[j].delta = nengine*sizeof(uint32_t);
> + reloc[j].delta = i*sizeof(uint32_t);
> reloc[j].read_domains = I915_GEM_DOMAIN_INSTRUCTION;
> reloc[j].write_domain = I915_GEM_DOMAIN_INSTRUCTION;
This should be (RENDER, RENDER)
INSTRUCTION, INSTRUCTION is special setting for a gen6 pipecontrol w/a
We don't want to confuse things for a basic liveness check.
> obj[1].relocs_ptr = (uintptr_t)&reloc[j];
> @@ -107,22 +114,22 @@ static void store_all(int fd)
> execbuf.batch_start_offset = j*sizeof(batch);
> gem_execbuf(fd, &execbuf);
>
> - j = 2*nengine + 1;
> + j = 2*i + 1;
> reloc[j].target_handle = obj[0].handle;
> reloc[j].presumed_offset = ~0;
> reloc[j].offset = j*sizeof(batch) + offset;
> - reloc[j].delta = nengine*sizeof(uint32_t);
> + reloc[j].delta = i*sizeof(uint32_t);
> reloc[j].read_domains = I915_GEM_DOMAIN_INSTRUCTION;
> reloc[j].write_domain = I915_GEM_DOMAIN_INSTRUCTION;
> obj[1].relocs_ptr = (uintptr_t)&reloc[j];
And we only need one batch, halving the amount of work we have to do.
>
> - batch[value] = nengine;
> + batch[value] = i;
Just set the first batch to emit batch[value] = i
-Chris
More information about the igt-dev
mailing list