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

Antonio Argenziano antonio.argenziano at intel.com
Mon Jun 18 17:12:22 UTC 2018



On 18/06/18 06:43, Chris Wilson wrote:
> Apply a different sort of stress by timing how long it takes to sync a
> second nop batch in the the pipeline. We first start a spinner on the
> engine, then when we now the GPU is active, we submit the second nop;

Typo ^^^^^^^^^^^^^^

> 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>
> ---
>   tests/gem_sync.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 90 insertions(+)
> 
> diff --git a/tests/gem_sync.c b/tests/gem_sync.c
> index 1e2e089a1..4cd97c58b 100644
> --- a/tests/gem_sync.c
> +++ b/tests/gem_sync.c
> @@ -177,6 +177,92 @@ idle_ring(int fd, unsigned ring, int timeout)
>   	gem_close(fd, object.handle);
>   }
>   
> +static void
> +wakeup_ring(int fd, unsigned ring, int timeout)
> +{

> +	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);

Would be interesting to have the same test for batches on different 
contexts.

> +		igt_assert(spin->running);
> +		cmd = *spin->batch;
> +
> +		gem_execbuf(fd, &execbuf);
> +
> +		igt_spin_batch_end(spin);
> +		gem_sync(fd, object.handle);
> +

> +	}
> +	igt_waitchildren_timeout(timeout+10, NULL);
> +	igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0);

When do you think we will (if ever) be ready to establish a baseline and 
fail this kind of tests on a performance regression?

Just for the lazy reader, do we have the same kind of test where the 
spinner is preempted by the nop batch?

Thanks,
Antonio

> +}
> +


More information about the igt-dev mailing list