[igt-dev] [PATCH i-g-t] tests/i915/gem_spin_batch: Update with engine discovery
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Wed Jul 3 09:50:16 UTC 2019
On 02/07/2019 10:00, Ramalingam C wrote:
> Legacy execbuf abi tests are prefixed with legacy. New test are added to
> run on physical engines accessed through engine discovery.
>
> So legacy tests run on the unconfigured (with engine map) context and
> use a new helper gem_eb_flags_to_engine to look up the engine from the
> intel_execution_engines2 static list. This is only to enable the
> core test code to be shared.
>
> Places where new contexts are created had to be updated to either
> equally configure the contexts or not.
>
> Signed-off-by: Ramalingam C <ramalingam.c at intel.com>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at linux.intel.com>
> ---
> tests/i915/gem_spin_batch.c | 71 +++++++++++++++++++++++++------------
> 1 file changed, 48 insertions(+), 23 deletions(-)
>
> diff --git a/tests/i915/gem_spin_batch.c b/tests/i915/gem_spin_batch.c
> index 3b4f90731539..6281fcbb374c 100644
> --- a/tests/i915/gem_spin_batch.c
> +++ b/tests/i915/gem_spin_batch.c
> @@ -32,7 +32,8 @@
> "'%s' != '%s' (%lld not within %d%% tolerance of %lld)\n",\
> #x, #ref, (long long)x, tolerance, (long long)ref)
>
> -static void spin(int fd, unsigned int engine, unsigned int timeout_sec)
> +static void spin(int fd, const struct intel_execution_engine2 *e2,
> + unsigned int timeout_sec)
> {
> const uint64_t timeout_100ms = 100000000LL;
> unsigned long loops = 0;
> @@ -41,9 +42,9 @@ static void spin(int fd, unsigned int engine, unsigned int timeout_sec)
> struct timespec itv = { };
> uint64_t elapsed;
>
> - spin = __igt_spin_new(fd, .engine = engine);
> + spin = __igt_spin_new(fd, .engine = e2->flags);
> while ((elapsed = igt_nsec_elapsed(&tv)) >> 30 < timeout_sec) {
> - igt_spin_t *next = __igt_spin_new(fd, .engine = engine);
> + igt_spin_t *next = __igt_spin_new(fd, .engine = e2->flags);
>
> igt_spin_set_timeout(spin,
> timeout_100ms - igt_nsec_elapsed(&itv));
> @@ -69,13 +70,14 @@ static void spin(int fd, unsigned int engine, unsigned int timeout_sec)
> #define RESUBMIT_NEW_CTX (1 << 0)
> #define RESUBMIT_ALL_ENGINES (1 << 1)
>
> -static void spin_resubmit(int fd, unsigned int engine, unsigned int flags)
> +static void spin_resubmit(int fd, const struct intel_execution_engine2 *e2,
> + unsigned int flags)
> {
> const uint32_t ctx0 = gem_context_create(fd);
> const uint32_t ctx1 = (flags & RESUBMIT_NEW_CTX) ?
> gem_context_create(fd) : ctx0;
> - igt_spin_t *spin = __igt_spin_new(fd, .ctx = ctx0, .engine = engine);
> - unsigned int other;
> + igt_spin_t *spin = __igt_spin_new(fd, .ctx = ctx0, .engine = e2->flags);
> + const struct intel_execution_engine2 *other;
>
> struct drm_i915_gem_execbuffer2 eb = {
> .buffer_count = 1,
> @@ -83,16 +85,23 @@ static void spin_resubmit(int fd, unsigned int engine, unsigned int flags)
> .rsvd1 = ctx1,
> };
>
> + igt_assert(gem_context_has_engine_map(fd, 0) ||
> + !(flags & RESUBMIT_ALL_ENGINES));
> +
> if (flags & RESUBMIT_ALL_ENGINES) {
> - for_each_physical_engine(fd, other) {
> - if (other == engine)
> + gem_context_set_all_engines(fd, ctx0);
> + if (ctx0 != ctx1)
> + gem_context_set_all_engines(fd, ctx1);
> +
> + for_each_context_engine(fd, ctx1, other) {
> + if (other->flags == e2->flags)
Make this comparison based on class:instance please. If there are enough
call sites consider a helper like gem_is_engine_equal?
> continue;
>
> - eb.flags = other;
> + eb.flags = other->flags;
> gem_execbuf(fd, &eb);
> }
> } else {
> - eb.flags = engine;
> + eb.flags = e2->flags;
> gem_execbuf(fd, &eb);
> }
>
> @@ -115,12 +124,12 @@ static void spin_exit_handler(int sig)
>
> static void spin_on_all_engines(int fd, unsigned int timeout_sec)
> {
> - unsigned engine;
> + const struct intel_execution_engine2 *e2;
>
> - for_each_physical_engine(fd, engine) {
> + __for_each_physical_engine(fd, e2) {
> igt_fork(child, 1) {
> igt_install_exit_handler(spin_exit_handler);
> - spin(fd, engine, timeout_sec);
> + spin(fd, e2, timeout_sec);
> }
> }
>
> @@ -129,6 +138,7 @@ static void spin_on_all_engines(int fd, unsigned int timeout_sec)
>
> igt_main
> {
> + const struct intel_execution_engine2 *e2;
> const struct intel_execution_engine *e;
> int fd = -1;
>
> @@ -141,20 +151,35 @@ igt_main
> }
>
> for (e = intel_execution_engines; e->name; e++) {
> - igt_subtest_f("basic-%s", e->name)
> - spin(fd, e->exec_id, 3);
> + e2 = gem_eb_flags_to_engine(e->exec_id | e->flags);
> + if (!e2)
> + continue;
And rebase to catch up with my fix which changes this helper to return
the object, not the pointer. Skip condition is then e2.flags == -1.
> +
> + igt_subtest_f("legacy-%s", e->name)
> + spin(fd, e2, 3);
> +
> + igt_subtest_f("legacy-resubmit-%s", e->name)
> + spin_resubmit(fd, e2, 0);
> +
> + igt_subtest_f("legacy-resubmit-new-%s", e->name)
> + spin_resubmit(fd, e2, RESUBMIT_NEW_CTX);
> + }
> +
> + __for_each_physical_engine(fd, e2) {
> + igt_subtest_f("%s", e2->name)
> + spin(fd, e2, 3);
>
> - igt_subtest_f("resubmit-%s", e->name)
> - spin_resubmit(fd, e->exec_id, 0);
> + igt_subtest_f("resubmit-%s", e2->name)
> + spin_resubmit(fd, e2, 0);
>
> - igt_subtest_f("resubmit-new-%s", e->name)
> - spin_resubmit(fd, e->exec_id, RESUBMIT_NEW_CTX);
> + igt_subtest_f("resubmit-new-%s", e2->name)
> + spin_resubmit(fd, e2, RESUBMIT_NEW_CTX);
>
> - igt_subtest_f("resubmit-all-%s", e->name)
> - spin_resubmit(fd, e->exec_id, RESUBMIT_ALL_ENGINES);
> + igt_subtest_f("resubmit-all-%s", e2->name)
> + spin_resubmit(fd, e2, RESUBMIT_ALL_ENGINES);
>
> - igt_subtest_f("resubmit-new-all-%s", e->name)
> - spin_resubmit(fd, e->exec_id,
> + igt_subtest_f("resubmit-new-all-%s", e2->name)
> + spin_resubmit(fd, e2,
> RESUBMIT_NEW_CTX |
> RESUBMIT_ALL_ENGINES);
> }
>
The rest is I think okay.
Regards,
Tvrtko
More information about the igt-dev
mailing list