[igt-dev] [PATCH] i915/gem_spin_batch: Add test to execute in parallel on all engines
Chris Wilson
chris at chris-wilson.co.uk
Thu Oct 31 21:55:05 UTC 2019
Quoting Vanshidhar Konda (2019-10-31 18:01:59)
> Add a test that submits batch buffers to all engines and executes them
> in parallel; either from the same context or from new contexts for each
> engine.
>
> Signed-off-by: Vanshidhar Konda <vanshidhar.r.konda at intel.com>
> ---
> tests/i915/gem_spin_batch.c | 53 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 53 insertions(+)
>
> diff --git a/tests/i915/gem_spin_batch.c b/tests/i915/gem_spin_batch.c
> index df59512a..c79cb7ea 100644
> --- a/tests/i915/gem_spin_batch.c
> +++ b/tests/i915/gem_spin_batch.c
> @@ -136,6 +136,54 @@ static void spin_on_all_engines(int fd, unsigned int timeout_sec)
> igt_waitchildren();
> }
>
> +#define PARALLEL_SPIN_NEW_CTX (1 << 0)
> +static void parallel_spin_all_engines(int fd, unsigned int flags)
> +{
> + igt_spin_t *spinner[I915_EXEC_RING_MASK + 1];
> + uint32_t ctx[I915_EXEC_RING_MASK + 1];
> + struct intel_execution_engine2 *engine;
> + int num_engines;
> + int i;
> +
> + ctx[0] = gem_context_create(fd);
> + gem_context_set_all_engines(fd, ctx[0]);
> +
> + for (i = 1; i < I915_EXEC_RING_MASK + 1; i++) {
> + ctx[i] = ctx[0];
> + if (flags & PARALLEL_SPIN_NEW_CTX) {
> + ctx[i] = gem_context_create(fd);
> + gem_context_set_all_engines(fd, ctx[i]);
> + }
> + }
> +
> + i = 0;
> + for_each_context_engine(fd, ctx[0], engine) {
> + igt_debug("Starting spin on engine: %d\n", i);
> + spinner[i] = igt_spin_new(fd,
> + .ctx = ctx[i],
> + .engine = i,
> + .flags = (IGT_SPIN_POLL_RUN |
> + IGT_SPIN_NO_PREEMPTION));
> + i++;
> + }
> +
> + num_engines = i;
> + for (i = 0; i < num_engines; i++) {
> + igt_debug("Busy wait for engine: %d\n", i);
> + igt_spin_busywait_until_started(spinner[i]);
> +
> + }
> +
> + for (i = 0; i < num_engines; i++)
> + igt_spin_free(fd, spinner[i]);
> +
> + if (flags & PARALLEL_SPIN_NEW_CTX) {
> + for (i = 1; i < I915_EXEC_RING_MASK + 1; i++)
> + gem_context_destroy(fd, ctx[i]);
> + }
> + gem_context_destroy(fd, ctx[0]);
I took the liberty of simplifying this and pushed.
-Chris
More information about the igt-dev
mailing list