[igt-dev] [PATCH i-g-t 2/6] igt/gem_sync: Alternate stress for nop+sync

Joonas Lahtinen joonas.lahtinen at linux.intel.com
Tue Jun 19 13:36:42 UTC 2018


Quoting Chris Wilson (2018-06-19 13:49:16)
> Apply a different sort of stress by timing how long it takes to sync a
> second nop batch in the pipeline. We first start a spinner on the
> engine, then when we know the GPU is active, we submit the second nop;
> start timing as we then release the spinner and wait for the nop to
> complete.
> 
> As with every other gem_sync test, it serves two roles. The first is
> that it checks that we do not miss a wakeup under common stressful
> conditions (the more conditions we check, the happier we will be that
> they do not occur in practice). And the second role it fulfils, is that
> it provides a very crude estimate for how long it takes for a nop to
> execute from a running start (we already have a complimentary estimate
> for an idle start).
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>

<SNIP>

> +static void
> +wakeup_ring(int fd, unsigned ring, int timeout)
> +{

<SNIP>

> +       intel_detect_and_clear_missed_interrupts(fd);
> +       igt_fork(child, num_engines) {
> +               const uint32_t bbe = MI_BATCH_BUFFER_END;
> +               struct drm_i915_gem_exec_object2 object;
> +               struct drm_i915_gem_execbuffer2 execbuf;
> +               double end, this, elapsed, now;
> +               unsigned long cycles;
> +               uint32_t cmd;
> +               igt_spin_t *spin;
> +
> +               memset(&object, 0, sizeof(object));
> +               object.handle = gem_create(fd, 4096);
> +               gem_write(fd, object.handle, 0, &bbe, sizeof(bbe));
> +
> +               memset(&execbuf, 0, sizeof(execbuf));
> +               execbuf.buffers_ptr = to_user_pointer(&object);
> +               execbuf.buffer_count = 1;
> +               execbuf.flags = engines[child % num_engines];
> +
> +               spin = __igt_spin_batch_new_poll(fd, 0, execbuf.flags);
> +               igt_assert(spin->running);
> +               cmd = *spin->batch;
> +
> +               gem_execbuf(fd, &execbuf);
> +
> +               igt_spin_batch_end(spin);
> +               gem_sync(fd, object.handle);
> +
> +               end = gettime() + timeout;
> +               elapsed = 0;
> +               cycles = 0;
> +               do {
> +                       *spin->batch = cmd;
> +                       *spin->running = 0;

igt_spin_batch_reset/resume/whatever...

Reviewed-by: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>

Regards, Joonas


More information about the igt-dev mailing list