[igt-dev] [PATCH i-g-t 28/93] tests/i915/gem_exec_fair: Convert to intel_ctx_t
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Thu Jun 10 12:10:07 UTC 2021
On Wed, Jun 09, 2021 at 12:36:11PM -0500, Jason Ekstrand wrote:
> Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
> ---
> tests/i915/gem_exec_fair.c | 112 +++++++++++++++++++++----------------
> 1 file changed, 65 insertions(+), 47 deletions(-)
>
> diff --git a/tests/i915/gem_exec_fair.c b/tests/i915/gem_exec_fair.c
> index 628f4df2..7b53cc1f 100644
> --- a/tests/i915/gem_exec_fair.c
> +++ b/tests/i915/gem_exec_fair.c
> @@ -225,7 +225,7 @@ static void delay(int i915,
> }
>
> static struct drm_i915_gem_exec_object2
> -delay_create(int i915, uint32_t ctx,
> +delay_create(int i915, const intel_ctx_t *ctx,
> const struct intel_execution_engine2 *e,
> uint64_t target_ns)
> {
> @@ -236,7 +236,7 @@ delay_create(int i915, uint32_t ctx,
> struct drm_i915_gem_execbuffer2 execbuf = {
> .buffers_ptr = to_user_pointer(&obj),
> .buffer_count = 1,
> - .rsvd1 = ctx,
> + .rsvd1 = ctx->id,
> .flags = e->flags,
> };
>
> @@ -326,7 +326,8 @@ static void tslog(int i915,
> }
>
> static struct drm_i915_gem_exec_object2
> -tslog_create(int i915, uint32_t ctx, const struct intel_execution_engine2 *e)
> +tslog_create(int i915, const intel_ctx_t *ctx,
> + const struct intel_execution_engine2 *e)
> {
> struct drm_i915_gem_exec_object2 obj = {
> .handle = batch_create(i915),
> @@ -335,7 +336,7 @@ tslog_create(int i915, uint32_t ctx, const struct intel_execution_engine2 *e)
> struct drm_i915_gem_execbuffer2 execbuf = {
> .buffers_ptr = to_user_pointer(&obj),
> .buffer_count = 1,
> - .rsvd1 = ctx,
> + .rsvd1 = ctx->id,
> .flags = e->flags,
> };
>
> @@ -362,7 +363,8 @@ static int cmp_u32(const void *A, const void *B)
> }
>
> static uint32_t
> -read_ctx_timestamp(int i915, const struct intel_execution_engine2 *e)
> +read_ctx_timestamp(int i915, const intel_ctx_t *ctx,
> + const struct intel_execution_engine2 *e)
> {
> struct drm_i915_gem_relocation_entry reloc;
> struct drm_i915_gem_exec_object2 obj = {
> @@ -374,6 +376,7 @@ read_ctx_timestamp(int i915, const struct intel_execution_engine2 *e)
> struct drm_i915_gem_execbuffer2 execbuf = {
> .buffers_ptr = to_user_pointer(&obj),
> .buffer_count = 1,
> + .rsvd1 = ctx->id,
> .flags = e->flags,
> };
> const int use_64b = intel_gen(intel_get_drm_devid(i915)) >= 8;
> @@ -415,23 +418,31 @@ read_ctx_timestamp(int i915, const struct intel_execution_engine2 *e)
> return ts;
> }
>
> -static bool has_ctx_timestamp(int i915, const struct intel_execution_engine2 *e)
> +static bool has_ctx_timestamp(int i915, const intel_ctx_cfg_t *cfg,
> + const struct intel_execution_engine2 *e)
> {
> const int gen = intel_gen(intel_get_drm_devid(i915));
> + const intel_ctx_t *tmp_ctx;
> + uint32_t timestamp;
>
> if (gen == 8 && e->class == I915_ENGINE_CLASS_VIDEO)
> return false; /* looks fubar */
>
> - return read_ctx_timestamp(i915, e);
> + tmp_ctx = intel_ctx_create(i915, cfg);
> + timestamp = read_ctx_timestamp(i915, tmp_ctx, e);
> + intel_ctx_destroy(i915, tmp_ctx);
> +
> + return timestamp;
> }
>
> static struct intel_execution_engine2
> -pick_random_engine(int i915, const struct intel_execution_engine2 *not)
> +pick_random_engine(int i915, const intel_ctx_cfg_t *cfg,
> + const struct intel_execution_engine2 *not)
> {
> const struct intel_execution_engine2 *e;
> unsigned int count = 0;
>
> - __for_each_physical_engine(i915, e) {
> + for_each_ctx_cfg_engine(i915, cfg, e) {
> if (e->flags == not->flags)
> continue;
> if (!gem_class_has_mutable_submission(i915, e->class))
> @@ -442,7 +453,7 @@ pick_random_engine(int i915, const struct intel_execution_engine2 *not)
> return *not;
>
> count = rand() % count;
> - __for_each_physical_engine(i915, e) {
> + for_each_ctx_cfg_engine(i915, cfg, e) {
> if (e->flags == not->flags)
> continue;
> if (!gem_class_has_mutable_submission(i915, e->class))
> @@ -454,7 +465,7 @@ pick_random_engine(int i915, const struct intel_execution_engine2 *not)
> return *e;
> }
>
> -static void fair_child(int i915, uint32_t ctx,
> +static void fair_child(int i915, const intel_ctx_t *ctx,
> const struct intel_execution_engine2 *e,
> uint64_t frame_ns,
> int timeline,
> @@ -495,7 +506,7 @@ static void fair_child(int i915, uint32_t ctx,
>
> srandom(getpid());
> if (flags & F_PING)
> - ping = pick_random_engine(i915, e);
> + ping = pick_random_engine(i915, &ctx->cfg, e);
> obj[0] = tslog_create(i915, ctx, &ping);
>
> /* Synchronize with other children/parent upon construction */
> @@ -515,7 +526,7 @@ static void fair_child(int i915, uint32_t ctx,
> struct drm_i915_gem_execbuffer2 execbuf = {
> .buffers_ptr = to_user_pointer(obj),
> .buffer_count = 3,
> - .rsvd1 = ctx,
> + .rsvd1 = ctx->id,
> .rsvd2 = -1,
> .flags = aux_flags,
> };
> @@ -637,7 +648,7 @@ static void timeline_advance(int timeline, int delay_ns)
> sw_sync_timeline_inc(timeline, 1);
> }
>
> -static void fairness(int i915,
> +static void fairness(int i915, const intel_ctx_cfg_t *cfg,
> const struct intel_execution_engine2 *e,
> int duration, unsigned int flags)
> {
> @@ -650,7 +661,7 @@ static void fairness(int i915,
> int parent[2];
> } lnk;
>
> - igt_require(has_ctx_timestamp(i915, e));
> + igt_require(has_ctx_timestamp(i915, cfg, e));
> igt_require(gem_class_has_mutable_submission(i915, e->class));
> if (flags & (F_ISOLATE | F_PING))
> igt_require(intel_gen(intel_get_drm_devid(i915)) >= 8);
> @@ -714,12 +725,12 @@ static void fairness(int i915,
> if (flags & F_PING) { /* fill the others with light bg load */
> struct intel_execution_engine2 *ping;
>
> - __for_each_physical_engine(i915, ping) {
> + for_each_ctx_cfg_engine(i915, cfg, ping) {
> if (ping->flags == e->flags)
> continue;
>
> igt_fork(child, 1) {
> - uint32_t ctx = gem_context_clone_with_engines(i915, 0);
> + const intel_ctx_t *ctx = intel_ctx_create(i915, cfg);
>
> fair_child(i915, ctx, ping,
> child_ns / 8,
> @@ -728,7 +739,7 @@ static void fairness(int i915,
> &result[nchild],
> NULL, NULL, -1, -1);
>
> - gem_context_destroy(i915, ctx);
> + intel_ctx_destroy(i915, ctx);
> }
> }
> }
> @@ -736,26 +747,24 @@ static void fairness(int i915,
> getrusage(RUSAGE_CHILDREN, &old_usage);
> igt_nsec_elapsed(memset(&tv, 0, sizeof(tv)));
> igt_fork(child, nchild) {
> - uint32_t ctx;
> + const intel_ctx_t *ctx;
>
> if (flags & F_ISOLATE) {
> - int clone, dmabuf = -1;
> + int dmabuf = -1;
>
> if (common)
> dmabuf = prime_handle_to_fd(i915, common);
>
> - clone = gem_reopen_driver(i915);
> - gem_context_copy_engines(i915, 0, clone, 0);
> - i915 = clone;
> + i915 = gem_reopen_driver(i915);
>
> if (dmabuf != -1)
> common = prime_fd_to_handle(i915, dmabuf);
> }
>
> - ctx = gem_context_clone_with_engines(i915, 0);
> + ctx = intel_ctx_create(i915, cfg);
>
> if (flags & F_VIP && child == 0) {
> - gem_context_set_priority(i915, ctx, 1023);
> + gem_context_set_priority(i915, ctx->id, 1023);
> flags |= F_FLOW;
> }
> if (flags & F_RRUL && child == 0)
> @@ -767,7 +776,7 @@ static void fairness(int i915,
> &result[child], &iqr[child],
> lnk.child[1], lnk.parent[0]);
>
> - gem_context_destroy(i915, ctx);
> + intel_ctx_destroy(i915, ctx);
> }
>
> {
> @@ -912,7 +921,7 @@ static void fairness(int i915,
> }
>
> static void deadline_child(int i915,
> - uint32_t ctx,
> + const intel_ctx_t *ctx,
> const struct intel_execution_engine2 *e,
> uint32_t handle,
> int timeline,
> @@ -932,7 +941,7 @@ static void deadline_child(int i915,
> .buffers_ptr = to_user_pointer(obj),
> .buffer_count = ARRAY_SIZE(obj),
> .flags = I915_EXEC_FENCE_OUT | e->flags,
> - .rsvd1 = ctx,
> + .rsvd1 = ctx->id,
> };
> unsigned int seq = 1;
> int prev = -1, next = -1;
> @@ -977,11 +986,12 @@ static void deadline_child(int i915,
> close(prev);
> }
>
> -static struct intel_execution_engine2 pick_default(int i915)
> +static struct intel_execution_engine2
> +pick_default(int i915, const intel_ctx_cfg_t *cfg)
> {
> const struct intel_execution_engine2 *e;
>
> - __for_each_physical_engine(i915, e) {
> + for_each_ctx_cfg_engine(i915, cfg, e) {
> if (!e->flags)
> return *e;
> }
> @@ -989,11 +999,12 @@ static struct intel_execution_engine2 pick_default(int i915)
> return (struct intel_execution_engine2){};
> }
>
> -static struct intel_execution_engine2 pick_engine(int i915, const char *name)
> +static struct intel_execution_engine2
> +pick_engine(int i915, const intel_ctx_cfg_t *cfg, const char *name)
> {
> const struct intel_execution_engine2 *e;
>
> - __for_each_physical_engine(i915, e) {
> + for_each_ctx_cfg_engine(i915, cfg, e) {
> if (!strcmp(e->name, name))
> return *e;
> }
> @@ -1030,15 +1041,16 @@ static uint64_t time_get_mono_ns(void)
> return tv.tv_sec * NSEC64 + tv.tv_nsec;
> }
>
> -static void deadline(int i915, int duration, unsigned int flags)
> +static void deadline(int i915, const intel_ctx_cfg_t *cfg,
> + int duration, unsigned int flags)
> {
> const int64_t frame_ns = 33670 * 1000; /* 29.7fps */
> const int64_t parent_ns = 400 * 1000;
> const int64_t switch_ns = 50 * 1000;
> const int64_t overhead_ns = /* estimate timeslicing overhead */
> (frame_ns / 1000 / 1000 + 2) * switch_ns + parent_ns;
> - struct intel_execution_engine2 pe = pick_default(i915);
> - struct intel_execution_engine2 ve = pick_engine(i915, "vcs0");
> + struct intel_execution_engine2 pe = pick_default(i915, cfg);
> + struct intel_execution_engine2 ve = pick_engine(i915, cfg, "vcs0");
> struct drm_i915_gem_exec_fence *fences = calloc(sizeof(*fences), 32);
> struct drm_i915_gem_exec_object2 *obj = calloc(sizeof(*obj), 32);
> struct drm_i915_gem_execbuffer2 execbuf = {
> @@ -1049,14 +1061,15 @@ static void deadline(int i915, int duration, unsigned int flags)
> I915_EXEC_FENCE_ARRAY |
> I915_EXEC_FENCE_OUT
> };
> + const intel_ctx_t *delay_ctx;
> int *ctl;
>
> igt_require(has_syncobj(i915));
> igt_require(has_fence_array(i915));
> igt_require(has_mi_math(i915, &pe));
> - igt_require(has_ctx_timestamp(i915, &pe));
> + igt_require(has_ctx_timestamp(i915, cfg, &pe));
> igt_require(has_mi_math(i915, &ve));
> - igt_require(has_ctx_timestamp(i915, &ve));
> + igt_require(has_ctx_timestamp(i915, cfg, &ve));
> igt_assert(obj && fences);
> if (flags & DL_PRIO)
> igt_require(gem_scheduler_has_preemption(i915));
> @@ -1064,9 +1077,10 @@ static void deadline(int i915, int duration, unsigned int flags)
> ctl = mmap(NULL, 4096, PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
> igt_assert(ctl != MAP_FAILED);
>
> - obj[0] = delay_create(i915, 0, &pe, parent_ns);
> + delay_ctx = intel_ctx_create(i915, cfg);
> + obj[0] = delay_create(i915, delay_ctx, &pe, parent_ns);
> if (flags & DL_PRIO)
> - gem_context_set_priority(i915, 0, 1023);
> + gem_context_set_priority(i915, delay_ctx->id, 1023);
> if (intel_gen(intel_get_drm_devid(i915)) < 8)
> execbuf.flags |= I915_EXEC_SECURE;
> for (int n = 1; n <= 5; n++) {
> @@ -1093,7 +1107,7 @@ static void deadline(int i915, int duration, unsigned int flags)
>
> *ctl = 0;
> igt_fork(child, num_children) {
> - uint32_t ctx = gem_context_clone_with_engines(i915, 0);
> + const intel_ctx_t *ctx = intel_ctx_create(i915, cfg);
>
> deadline_child(i915, ctx, &ve, obj[child + 1].handle,
> timeline, child_ns,
> @@ -1101,7 +1115,7 @@ static void deadline(int i915, int duration, unsigned int flags)
> link[child].parent[0],
> ctl, flags);
>
> - gem_context_destroy(i915, ctx);
> + intel_ctx_destroy(i915, ctx);
> }
>
> for (int i = 0; i < num_children; i++)
> @@ -1175,6 +1189,7 @@ static void deadline(int i915, int duration, unsigned int flags)
> gem_quiescent_gpu(i915);
> }
>
> + intel_ctx_destroy(i915, delay_ctx);
> gem_close(i915, obj[0].handle);
> free(obj);
> free(fences);
> @@ -1282,6 +1297,7 @@ igt_main
> {}
> };
> const struct intel_execution_engine2 *e;
> + intel_ctx_cfg_t cfg;
> int i915 = -1;
>
> igt_fixture {
> @@ -1297,6 +1313,8 @@ igt_main
> igt_require(gem_scheduler_enabled(i915));
> igt_require(gem_scheduler_has_ctx_priority(i915));
>
> + cfg = intel_ctx_cfg_all_physical(i915);
> +
> igt_info("CS timestamp frequency: %d\n",
> read_timestamp_frequency(i915));
> igt_require(has_mi_math(i915, NULL));
> @@ -1310,7 +1328,7 @@ igt_main
> continue;
>
> igt_subtest_with_dynamic_f("basic-%s", f->name) {
> - __for_each_physical_engine(i915, e) {
> + for_each_ctx_cfg_engine(i915, &cfg, e) {
> if (!has_mi_math(i915, e))
> continue;
>
> @@ -1321,19 +1339,19 @@ igt_main
> continue;
>
> igt_dynamic_f("%s", e->name)
> - fairness(i915, e, 1, f->flags);
> + fairness(i915, &cfg, e, 1, f->flags);
> }
> }
> }
>
> igt_subtest("basic-deadline")
> - deadline(i915, 2, 0);
> + deadline(i915, &cfg, 2, 0);
> igt_subtest("deadline-prio")
> - deadline(i915, 2, DL_PRIO);
> + deadline(i915, &cfg, 2, DL_PRIO);
>
> for (typeof(*fair) *f = fair; f->name; f++) {
> igt_subtest_with_dynamic_f("fair-%s", f->name) {
> - __for_each_physical_engine(i915, e) {
> + for_each_ctx_cfg_engine(i915, &cfg, e) {
> if (!has_mi_math(i915, e))
> continue;
>
> @@ -1344,7 +1362,7 @@ igt_main
> continue;
>
> igt_dynamic_f("%s", e->name)
> - fairness(i915, e, 5, f->flags);
> + fairness(i915, &cfg, e, 5, f->flags);
> }
> }
> }
> --
> 2.31.1
The only potentially important difference was to check supporting
ctx_timestamp. Original code uses ctx0 so it left that counter
bumped by the check. Your code uses separate context for that but
it seems not important here. Thus:
Reviewed-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
--
Zbigniew
>
> _______________________________________________
> igt-dev mailing list
> igt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/igt-dev
More information about the igt-dev
mailing list